回答:
彼らは常に同じ結果を与えます。
実際、not 'ham' in 'spam and eggs'
「in」操作ではなく結果を否定するのではなく、単一の「not in」操作を実行する特殊なケースのように見えます。
>>> import dis
>>> def notin():
'ham' not in 'spam and eggs'
>>> dis.dis(notin)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not_in():
not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not__in():
not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def noteq():
not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 2 (==)
9 UNARY_NOT
10 POP_TOP
11 LOAD_CONST 0 (None)
14 RETURN_VALUE
最初はそれらが常に同じ結果not
を与えると思っていましたが、それ自体は単に優先順位の低い論理否定演算子でありa in b
、他のブール式と同じように簡単に適用できnot in
、便宜と明確さのために別の演算子でした。
上記の分解が明らかになりました!一方でいるようだnot
、明らかに論理否定演算子であり、形はnot a in b
特別に、それは実際に一般的な演算子を使用していないようにケースに入れています。これにより、同じ値になる式だけではなく、not a in b
文字通りと同じ式a not in b
になります。
not x in xs
IS not (x in xs)
。しかし、それは次のように正確に同じバイトコードにそれを解析することによって実現していますという事実x not in xs
のようなものとは対照的に、彼らは、常に同じでなければならないことを非常に明確に示したnot x == y
対x != y
これは、必要があり、同じ結果を与えるが、(の実装に依存する必要はありません__eq__
と__ne__
関与)。
演算子
not in
は、の逆の真の値を持つように定義されていますin
。
not in
それはより明白であり、彼らはそれのために特別なケースを追加したので、私は好ましいと思います。これらは同じ意味ですが、pycodestyle Pythonスタイルガイドチェッカー(以前はpep8と呼ばれていました)は、ルールE713のnot in
演算子を優先します。
E713:メンバーシップのテストは
not in
「Python if x is not None
またはif not x is None
?」も参照してください。非常によく似たスタイルを選択します。
他の人たちはすでに、2つのステートメントが非常に低いレベルまで同等であることを明確にしています。
しかし、これはあなたに選択を任せているので、あなたがすべきことをまだ強調している人はまだいないと思います
そして、もちろんそれが狙いとしては良いことだとしても、必ずしも誰にでも読みやすいとは限りません。いいえ。コードができるだけ読みやすくなるようにしてください。あなたが後でこのコードに戻って読んでみる可能性が最も高いのはあなただからです。
Pythonでは、違いはありません。そして、好みはありません。
not x in xs
ドキュメントでの言及も見つかりません。