我两种方式都见过,但哪种方式更符合 Python 风格?
a = [1, 2, 3]
# version 1
if not 4 in a:
print 'is the not more pythonic?'
# version 2
if 4 not in a:
print 'this haz more engrish'
哪种方式被认为是更好的Python?
我两种方式都见过,但哪种方式更符合 Python 风格?
a = [1, 2, 3]
# version 1
if not 4 in a:
print 'is the not more pythonic?'
# version 2
if 4 not in a:
print 'this haz more engrish'
哪种方式被认为是更好的Python?
第二个选项更符合Python语言的风格,有两个原因:
这是一个运算符,翻译成一个字节码操作数。而另一行代码实际上是not (4 in a)
,需要两个运算符。
恰好地,Python优化了后者的情况,并将not (x in y)
翻译成x not in y
,但这是CPython编译器的具体实现细节。
[bar for bar in baz if not not not not not '0' not in str(bar)]
不太符合 Pythonic 风格,而 [bar for bar in baz if not not not not not '0' not in str(bar)]
则符合 Pythonic 风格。 - Derek Litz大多数人都会同意4 not in a
更符合Pythonic。
Python的设计目的是易于理解和可读性强,4 not in a
听起来更像你用英语说的方式——很有可能你不需要了解Python就可以理解这个意思!
请注意,在字节码方面,两者在CPython中将是相同的(尽管not in
在技术上是单个运算符,但not 4 in a
是可以进行优化的):
>>> import dis
>>> def test1(a, n):
not n in a
>>> def test2(a, n):
n not in a
>>> dis.dis(test1)
2 0 LOAD_FAST 1 (n)
3 LOAD_FAST 0 (a)
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(test2)
2 0 LOAD_FAST 1 (n)
3 LOAD_FAST 0 (a)
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
4 not in a
更为理想,但有时可以优先选择另一个选项not 4 in a
。not 4 in a
编写的,则最好保持与规范匹配,以便在检查软件是否符合规范时提供帮助。( 4 in well,
well,
not well,
not 4 in well) #!