什么是'不'的'pythonic'

Mic*_*ael 32 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'
Run Code Online (Sandbox Code Playgroud)

哪种方式被认为是更好的Python?

Mar*_*ers 46

第二种选择是更多Pythonic,原因有两个:

  • 它是一个运算符,转换为一个字节码操作数.另一条线确实是not (4 in a); 两个运营商.

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

  • 它与您在英语中使用相同逻辑的方式非常接近.

  • 你能找到那个来源吗? (5认同)
  • @MartijnPieters发现它http://hg.python.org/cpython/file/ed8b0ee1c531/Python/peephole.c#l405;) (2认同)
  • 这仍然是一种意见,幸运的是,没有人有义务坚持. (2认同)
  • @doukremt 事实是有参考,pythonic是可以理解的东西,有具体的专业知识。我觉得有点讽刺的是,那些不理解这些事情的人可以根据他们的观点来结束某些事情,认为这是一种观点。事实上,第二个是该语言的更多 pythonic 用法。让我让这个简单的`[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 not '0' not in str(bar)]` 不是pythonic。 (2认同)

ars*_*jii 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        
Run Code Online (Sandbox Code Playgroud)


der*_*ann 8

我相信它not in被广泛使用.

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

不要忘记Python的禅宗.编写Python的核心原则之一是"可读性很重要",因此请选择在代码中最清晰的阅读和理解.