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

在testing会员时,我们可以使用:

x not in y 

或者:

 not y in x 

取决于xy ,这个expression式可能有许多可能的上下文。 例如,它可能是一个子string检查,列表成员,字典键存在。

  • 这两种forms总是等同的吗?
  • 有一个首选的语法?

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

事实上, 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一个简单的低优先级的逻辑否定运算符,它可以像任何其他布尔expression式一样容易地应用于a in b ,而not in单独的操作员为了方便和清晰。

上面的反汇编显示! 看起来虽然not明显的逻辑否定运算符,但是not a in b的forms是特殊的,所以它实际上并不使用普通运算符。 这not a in b使not a in b字面上与not a in ba not in b相同的expression式,而不仅仅是导致相同值的expression式。

  1. 不,没有区别。

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

– Python文档

  • 我会假设not in因为这是更明显的,他们增加了一个特殊的情况。
  • 在Python中,没有区别。 没有偏好。

    其他人已经说得很清楚了,这两个陈述是相当低的水平。

    但是,我不认为任何人还没有强调过,因为这样就把select留给了你,你应该

    select使您的代码尽可能可读的表单。

    而且不一定对任何人都是可读的,即使这当然是一个好目标。 不,请确保代码对您来说是尽可能可读的,因为您是最可能稍后再回到此代码并尝试阅读代码的人。

    它们意义相同,但是pep8 Python风格指南检查器更喜欢规则E713中的not in运算符:

    E713:testing会员应该not in

    另请参见“Python if x is not None或者if not x is None ? 为一个非常类似的风格select。

    语法上它们是相同的语句。 我会很快地说, 'ham' not in 'spam and eggs'中的'ham' not in 'spam and eggs'expression了更明确的意图,但是我已经看到了代码和情景,其中not 'ham' in 'spam and eggs'expression的意思比其他的更清晰。