使用“not”和“in”关键字的语法顺序

时间:2012-01-05 06:11:46

标签: python syntax

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

x not in y

或者:

not y in x

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

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

6 个答案:

答案 0 :(得分:102)

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

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

>>> 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 in是一个单独的运算符,以方便和清晰。

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

答案 1 :(得分:13)

  1. 不,没有区别。

      

    运算符not in被定义为具有in的反向真值。

         

    - Python documentation

  2.   
  3. 我认为not in是首选,因为它更明显,并为它添加了特殊情况。
  4.   

答案 2 :(得分:5)

它们的含义相同,但pep8 Python style guide checker更喜欢rule E713中的not in运算符:

  

E713:会员资格测试应为not in

另请参阅"Python if x is not None or if not x is None?"以获得非常相似的风格选择。

答案 3 :(得分:3)

其他人已经非常清楚地表明这两个陈述是相当低的等级。

但是,我认为没有人有足够的压力,因为这会让你选择,你应该

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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