关于python:使用’not’和’in’关键字的语法顺序

Order of syntax for using 'not' and 'in' keywords

在测试会员资格时,我们可以使用:

1
x not in y

或者:

1
not y in x

根据xy,此表达式可能有许多可能的上下文。 例如,它可以用于子字符串检查,列表成员资格,字典密钥存在。

  • 这两种形式总是相同吗?
  • 有首选语法吗?

他们总是给出相同的结果。

实际上,not 'ham' in 'spam and eggs'似乎是特殊的,可以执行单个"not in"操作,而不是"in"操作,然后否定结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
>>> import dis

>>> def notin():
    'ham' not in 'spam and eggs'
>>> dis.dis(notin)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP            
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not_in():
    not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP            
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not__in():
    not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP            
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        

>>> def noteq():
    not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT          
             10 POP_TOP            
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE

我一开始以为他们总是给出相同的结果,但not本身只是一个低优先级逻辑否定运算符,可以像任何其他布尔表达式一样轻松地应用于a in b,而为了方便和清晰,它是一个单独的操作员。

上面的反汇编揭示了!似乎虽然not显然是一个逻辑否定运算符,但形式not a in b是特殊的,因此它实际上并没有使用一般运算符。这使not a in ba not in b完全相同,而不仅仅是导致相同值的表达式。


  • 不,没有区别。

    The operator not in is defined to have the inverse true value of in.

    —Python documentation

  • I would assume not in is preferred because it is more obvious and they added a special case for it.

  • 它们的含义相同,但pep8 Python样式指南检查程序更喜欢规则E713中的not in运算符:

    E713: test for membership should be not in

    另请参阅"Python if x is not Noneif not x is None?"对于非常相似的风格选择。


    其他人已经明确表示,这两个陈述是相当低的水平。

    但是,我不认为任何人都有足够的压力,因为这会让你选择,你应该这样做

    选择使代码尽可能可读的表单。

    并不一定对任何人都可读,即使这当然是一件好事。不,确保代码尽可能可读,因为您是最有可能在以后回到此代码并尝试阅读它的人。


    在Python中,没有区别。而且没有偏好。


    从语法上讲,它们是相同的陈述。我会很快说明'ham' not in 'spam and eggs'表达了更清晰的意图,但我已经看到了代码和场景,其中not 'ham' in 'spam and eggs'传达了比另一个更清晰的意义。