2010-02-06 3 views
1

난 항상이 선호했습니다두 연산자 모두에 "not in"과 "are not"가 있습니까? 그렇다면 어떤 식 으로든 "not x in .."과 "not x is .."와는 다른가요?

(모두가 inisnot가 아웃 우선 순위를 알고 물론, 가정 - 아마 괄호를 사용한다)
not 'x' in 'abc' 
not 'x' is 'a' 

더 (영어)을 통해 문법 :

'x' not in 'abc' 
'x' is not 'a' 

하지만 생각 귀찮게하지 않았는지 나는 그들이 구문 이해가되지 않습니다 실현 될 때까지

'x' == not 'a' 
'x' not == 'a' 

물론 둘 다 구문 오류가 발생합니다.

그래서 나는 그들이 두 단어로 된 연산자라고 생각했습니다. 그러나 은 is not만을 나타내며 not in은 언급하지 않습니다. 아마도 구문을 잘못 해석 한 것입니까?

두 연산자가 모두 연산자 인 경우 문법적이지 않은 요소와 전혀 다릅니 까?

동일하면 왜 존재합니까? Zen of Python (.. "바람직하고 단 하나 - 분명한 방법")

이것이 죽음에 대해 이미 논의 되었다면 사과드립니다. 나는 운이 좋았습니다. "is not"와 같은 검색어.

파이썬 가입일
+0

+1 : 질문이 문서를 참조하는 것이 좋습니다. -1 : 언어 문서 자체가 아닌'operator' 모듈을 참조합니다. –

+0

사실 나는 계속 찾아야했지만 표준 라이브러리가 불완전하다는 것을 예상하지 못했습니다. – Paul

+0

@bpowah : "표준 라이브러리가 불완전하다고 기대하지 않았습니다."나는 그 기대를 이해하지 못합니다. "완전"이란 무엇을 의미합니까? 그리고 당신은이 기대를 어디에서 얻었습니까? 귀하의 "완성도"기준을 충족시키는 내장 라이브러리가있는 다른 언어에는 어떤 것이 있습니까? 당신은보기 또는 참고가 있는가? –

답변

4

에게 2.6.4 문서에서 : http://docs.python.org/reference/expressions.html >

오퍼레이터에에서의 역 참값을 갖도록 정의되어 있지

연산자이며, 테스트되지 않는다. 개체 ID : x와 y가 같은 개체 인 경우에만 x는 y이고 참이면 입니다. x 이 y가 아니면 역 진리 값을 산출합니다.

예 : "x in y"는 "y in not x"와 "x is not y"는 "not x is y"와 동일합니다.

구문 분석하지 않습니다 "X Y는 ==하지", 그러나 "x는 = y를!"않기 때문에 등가가

HTH가 ... 너무 거기에있다.

2

질문의 나머지 부분은 위에 답변했지만 마지막 질문 인 Zen of Python 비트에 대해 말씀 드리겠습니다.

"할 방법이 하나 밖에 없어야합니다"라는 말은 수학적 의미가 아닙니다. 그렇다면 의 역전이므로 != 연산자가 없습니다. 마찬가지로 andor도 없습니다. 결국 nand 명령 하나만 사용할 수 있습니다. "편도"만트라에는 한계가 있습니다. 한 가지 고급 방법 만 있어야합니다. 물론 높은 수준의 방법을 분해 할 수 있습니다. 직접 작성할 수는 math.tan이며, urllib --- socket을 항상 사용할 수 있습니다.그러나 마찬가지로 urllib.open은 원시 socket 연산의 상위 레벨 캡슐화이므로 not in은 상위 레벨 캡슐화 notin입니다. 그것은 조금 진부한 말입니다. 하지만 not (x == y) 대신 x != y을 사용합니다.

2

문서 참조는 구문과 관련이 없습니다. Try this. is notnot in은 모두 2 단어 연산자입니다.

0

x in a은 요소 x가 (이 경우 아마 목록이나 문자열 또는 일부일 수 있음) 여부를 테스트하고 True을 반환합니다.

x not in a은 비슷하지만 x가 a 인 경우 False을 반환합니다.

한편, x is not ax != anot x is a과 유사합니다.

그리고 당신이 말한 것처럼, X == 5는 당신에게 dis 모듈이 어떤 차이가 있는지를 확인하기 쉽습니다

7

종류의 오류, 줄 것이다 없습니다 :

>>> dis.dis(compile('not a in b','','exec')) 
    1   0 LOAD_NAME    0 (a) 
       3 LOAD_NAME    1 (b) 
       6 COMPARE_OP    7 (not in) 
       9 POP_TOP    
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   
>>> dis.dis(compile('a not in b','','exec')) 
    1   0 LOAD_NAME    0 (a) 
       3 LOAD_NAME    1 (b) 
       6 COMPARE_OP    7 (not in) 
       9 POP_TOP    
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   

참조를? 어색한 첫 번째 형태 (종종 notin 연산자의 상대적인 우선 순위를 즉시 알 수없는 사람들을 혼란스럽게 만드는 사람)는 not in 연산자를 사용하여 두 번째로 혼동하지 않는 것과 정확히 동일한 바이트 코드로 컴파일됩니다. 마찬가지로 :

>>> dis.dis(compile('not a is b','','exec')) 
    1   0 LOAD_NAME    0 (a) 
       3 LOAD_NAME    1 (b) 
       6 COMPARE_OP    9 (is not) 
       9 POP_TOP    
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   
>>> dis.dis(compile('a is not b','','exec')) 
    1   0 LOAD_NAME    0 (a) 
       3 LOAD_NAME    1 (b) 
       6 COMPARE_OP    9 (is not) 
       9 POP_TOP    
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   

두 가지 형태 - 구피 혼란 첫째, 다른 하나 우아한 초 - 똑같은 코드를 비교하고, 양 is not 연산자를 사용한다. 하지만, 실행의 의미와 속도면에서 차이가 전혀 없다 - (! 코드를 읽는 사람들을 위해 트랩을 설정하는 같은 경우 제외) 물론

독자를 혼동 할 수있는 양식을 사용하는 좋은 이유가 없다 .

+0

이것은 정확히 내가보고 싶었던 것입니다! 고맙습니다. 어떤 이유로 든 2 단어 연산자에 대해 약간 불안한 것 같아요. (not_in을 선호했을 것입니다.)하지만 이제는 나에게 의미가 있으며 훨씬 더 읽기 쉽도록 이제는 사용할 것입니다. – Paul