什么是'不'的'pythonic'

时间:2013-07-15 16:39:26

标签: python if-statement not-operator

我已经看过两种方式,但哪种方式更像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?

4 个答案:

答案 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) #!