使用“不”和“in”关键字的语法顺序
在testing会员时,我们可以使用:
x not in y
或者:
not y in x
取决于x
和y
,这个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 b
中a not in b
相同的expression式,而不仅仅是导致相同值的expression式。
- 不,没有区别。
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的意思比其他的更清晰。