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

2 番目のオプションは、次の 2 つの理由からより Pythonic です。

  • これは1 つの演算子であり、1 つのバイトコード オペランドに変換されます。他の行は本当にnot (4 in a)です。2人のオペレーター。

    たまたま、Pythonは後者のケースを最適化し、とにかく変換not (x in y)​​しますが、それは CPython コンパイラの実装の詳細です。x not in y

  • これは、英語で同じロジックを使用する方法に近いものです。
于 2013-07-15T16:44:09.223 に答える
22

ほとんどの人は、それ4 not in aがより Pythonic であることに同意するでしょう。

Python は、理解しやすく理解しやすいことを目的として設計されており4 not in a、英語での言い方のように聞こえます。Python の意味を理解するのに、Python の知識は必要ありません。

バイトコードに関しては、この 2 つは 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であると見なされています。

The Zen of Python を忘れないでください。Python を書く際の中心的な信条の 1 つは、「読みやすさが重要」であるため、コードを読んで理解するのが最も明確な選択を行ってください。

于 2013-07-15T16:42:51.857 に答える