35

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

4 回答 4

48

第二个选项更 Pythonic 有两个原因:

  • 它是一个运算符,转换为一个字节码操作数。另一行是真的not (4 in a);两个运算符。

    碰巧的是,Python优化了后一种情况并转换not (x in y)x not in y无论如何,但这是 CPython 编译器的实现细节。

  • 这与您在英语中使用相同逻辑的方式很接近。
于 2013-07-15T16:44:09.223 回答
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        
于 2013-07-15T16:41:27.350 回答
8

我相信not in使用更广泛。

虽然 PEP 8 风格指南没有明确讨论该主题,但它确实认为not in它自己的比较运算符

不要忘记Python 之禅。编写 Python 的核心原则之一是“可读性很重要”,因此请选择在您的代码中最易于阅读和理解的选项。

于 2013-07-15T16:42:51.857 回答
2

虽然4 not in a在单独做出选择时是首选,但在某些情况下not 4 in a可能会首选其他选择。

例如,如果软件的规范是为匹配而编写的,not 4 in a那么最好让它与规范保持一致,以帮助检查软件是否符合规范。

另一个例子是,一种方式允许这种恶化的健康表达:

( 4 in well,
  well,
  not well,
  not 4 in well) #!
于 2013-07-15T18:46:50.190 回答