Python &引用;x不在y中;或;不是“y中的x”;
在测试会员资格时,我们可以使用:Python &引用;x不在y中;或;不是“y中的x”;,python,syntax,operators,Python,Syntax,Operators,在测试会员资格时,我们可以使用: x not in y 或者: not x in y 根据x和y的不同,此表达式可能有多种上下文。例如,它可以用于子字符串检查、列表成员资格、dict键是否存在 这两种形式总是等价的吗 是否有首选语法 在Python中,没有区别。而且没有偏好。 不,没有区别 运算符不在被定义为具有中的的反真值 - 我认为不在中是首选,因为它更明显,而且他们为它添加了一个特例 从语法上讲,它们是相同的语句。我会很快指出,在“垃圾邮件和鸡蛋”中不“火腿”表达了更清晰的意图,但
x not in y
或者:
not x in y
根据x
和y
的不同,此表达式可能有多种上下文。例如,它可以用于子字符串检查、列表成员资格、dict键是否存在
- 这两种形式总是等价的吗李>
- 是否有首选语法
不在
被定义为具有中的的反真值
-
不在
中是首选,因为它更明显,而且他们为它添加了一个特例从语法上讲,它们是相同的语句。我会很快指出,
在“垃圾邮件和鸡蛋”中不“火腿”表达了更清晰的意图,但我看到过这样的代码和场景:在“垃圾邮件和鸡蛋”中不“火腿”表达了比另一个更清晰的含义。它们总是给出相同的结果
事实上,“垃圾邮件和鸡蛋”中的非“火腿”似乎是一种特殊情况,它执行一个“不在”操作,而不是一个“在”操作,然后否定结果:
>>> 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
本身只是一个低优先级的逻辑求反运算符,它可以像其他布尔表达式一样容易地应用于b
中的a,而not in
是一个单独的运算符,以方便和清晰
上面的分解很有启发性!显然,not
是一个逻辑否定运算符,而b
中的形式nota是特殊情况,因此它实际上没有使用一般运算符。这使得非b中的a与非b中的a在字面上是相同的表达式,而不仅仅是导致相同值的表达式。其他人已经非常清楚地表明,这两个语句在相当低的级别上是等效的
然而,我认为还没有人足够强调,既然这让你有选择权,你应该
选择使代码尽可能可读的格式。
而且不一定对任何人来说都是可读的,即使这当然是一件好事。不,请确保代码尽可能可读,因为您是最有可能稍后返回此代码并尝试阅读它的人。它们的含义相同,但首选not in
操作符:
E713:成员资格测试应不在
另请参阅,以了解非常类似的样式选择。请记住,这只是一个实现细节。我甚至在文档中找不到xs中提到的而不是x
。@phant0m绝对;你认为不是xs中的x
的方式是不是(xs中的x)
。但是,它是通过将其解析为与x not in xs
完全相同的字节码来实现的,这一事实非常清楚地表明,它们必须始终相同,而不是像not x==y
vsx!=y
应该给出相同的结果,但不必(取决于\uuuuu eq\uuuu
和\uu ne\uuuu
的实现);其他Python实现(如Jython和IronPython)可以自由忽略或复制的编译时优化(它不是语言规范的一部分)。如果您在一个大型团队中工作,或者在一段时间内可能不会涉及到的代码上工作,那么很可能需要其他人来维护它。