我已经看过两种方式,但哪种方式更像Pythonic?
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?
答案 0 :(得分:45)
第二种选择更像是Pythonic,原因有两个:
它是一个运算符,转换为一个字节码操作数。另一行真的是not (4 in a)
;两个运营商。
碰巧,Python optimizes the latter case并将not (x in y)
转换为x not in y
,但这是CPython编译器的实现细节。
答案 1 :(得分:22)
大多数人都同意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
答案 2 :(得分:8)
我相信not in
被广泛使用。
虽然PEP 8样式指南未明确讨论该主题,但它确实将not in
视为its own comparison operator。
不要忘记The Zen of Python。编写Python的核心原则之一就是“可读性很重要”,因此请选择最清晰的代码来阅读和理解。
答案 3 :(得分:2)
虽然在单独进行选择时首选4 not in a
,但可能会出现另一种选择not 4 in a
的情况。
例如,如果软件的规范编写为与not 4 in a
匹配,则最好将其与规范保持一致,以便在根据规范检查软件时提供帮助。
另一个例子是,一种方式可以表现出健康状况恶化:
( 4 in well,
well,
not well,
not 4 in well) #!