/ /「いない」と「いない」は両方の演算子ですか。もしそうなら、それらは何らかの意味で“ not x in ..”や“ not x is ..”と違うのでしょうか? - python

両方の演算子に「ない」と「ない」はありますか?そうであれば、彼らは "x in .."と "x not is .."とは何らかの形で違いますか? - python

私はいつもこれらを好んだ。

not "x" in "abc"
not "x" is "a"

(もちろん、誰もが知っていると仮定して in そして is 優先順位を下げる not - 私はたぶん括弧を使うべきです。

"x" not in "abc"
"x" is not "a"

しかし、私が気付くまで彼らが文法的に意味を成さない理由を考えても構わない。

"x" == not "a"
"x" not == "a"

もちろん両方とも構文エラーをスローします。

それで私は彼らが二語演算子であると考えました。しかし ドキュメンテーション 参照のみ is not そして言及していない not in オペレータとして。構文を誤って解釈しているのでしょうか。

それらが両方とも演算子であるならば、それらは彼らの非文法的な対応物と全く(微妙にさえ)異なっていますか?

それらが同じなら、なぜそれらは存在するのでしょうか?それはに不快なようです Pythonの禅 (..「1つ - そしてできれば1つだけ - 自明の方法」..)

これが既に死に議論されているのであれば謝罪します、 "is not"のような検索用語でそれを見つけるのは私はほとんど運がありませんでした。

回答:

回答№1は4

次のpython 2.6.4のドキュメントから: http://docs.python.org/reference/expressions.html >

にない演算子は、次のように定義されています。 inの逆の真の値

演算子はテスト済みであり、テストされていません オブジェクトの同一性:xがyで、かつ xとyが同じオブジェクトの場合のみバツ yでない場合、逆の真実が得られます 値。

例えば、「xがyに含まれていない」と「xがyに含まれていない」とまったく同じであり、「xがyとなっていない」と「xがyではない」と同じです。

"x not == y"はパースしませんが、 "x!= y"はパースします、それで等価性もあります...

HTH。


回答№2のための7

違いがあるかどうかを確認するのは簡単です。 ディス モジュール:

>>> dis.dis(compile("not a in b","","exec"))
1           0 LOAD_NAME                0 (a)
3 LOAD_NAME                1 (b)
6 COMPARE_OP               7 (not in)
9 POP_TOP
10 LOAD_CONST               0 (None)
13 RETURN_VALUE
>>> dis.dis(compile("a not in b","","exec"))
1           0 LOAD_NAME                0 (a)
3 LOAD_NAME                1 (b)
6 COMPARE_OP               7 (not in)
9 POP_TOP
10 LOAD_CONST               0 (None)
13 RETURN_VALUE

見る?厄介な最初の形式(だれがすぐに相対的な優先順位を伝えることができない人々を混同します not そして in (演算子)は、 "t-confuse-anybody second"とまったく同じバイトコードにコンパイルされます。 not in オペレーター。同様に:

>>> dis.dis(compile("not a is b","","exec"))
1           0 LOAD_NAME                0 (a)
3 LOAD_NAME                1 (b)
6 COMPARE_OP               9 (is not)
9 POP_TOP
10 LOAD_CONST               0 (None)
13 RETURN_VALUE
>>> dis.dis(compile("a is not b","","exec"))
1           0 LOAD_NAME                0 (a)
3 LOAD_NAME                1 (b)
6 COMPARE_OP               9 (is not)
9 POP_TOP
10 LOAD_CONST               0 (None)
13 RETURN_VALUE

どちらの形式も - 間抜けで混乱しやすい最初のものとエレガントな2番目のもの - まったく同じコードと比較して、両方とも is not オペレーター。

もちろん、読者を混乱させる可能性のあるフォームを使用するのに十分な理由はありません( 好きな あなたのコードを読む人のためにトラップを設定すること! - )、しかし実行の意味論とスピードの点では全く違いはありません。


答え№3の2

あなたの質問の残りの部分は上で答えました、しかし私は最後の質問に取り組むでしょう:Pythonの禅ビット。

「それを行うには1つの方法しかないはずです」というのは数学的な意味ではありません。もしそうであれば、「ありません」 != というのは、これは ==。同様に、いいえ and そして or ---結局のところ、あなただけの単一を使用することができます nand コマンド。 「一方通行」の考え方には限界があります。それを行うには、高水準のやり方が1つだけあるべきです。もちろん、そのハイレベルな方法は分解することができます---あなたはあなた自身のものを書くことができます math.tan、そしてあなたは使用する必要はありません urllib --- socket あなたのためにいつもそこにあります。しかしちょうど urllib.open rawの高レベルのカプセル化です socket 操作、そう not in の高レベルのカプセル化です。 not そして in。それはちょっとばかげている、あなたが言うかもしれません。しかし、あなたは使用します x != y の代わりに not (x == y).


答え№4の2

ドキュメンテーションの参照は構文とは関係ありません。 これを試して。両方 is not そして not in 2語演算子です。


回答№5の場合は0

x in a 要素xがa(この場合はおそらくリストか文字列か、その他)にあるかどうかをテストして返します。 True もしそれが。

x not in a 似ていますが返します False xがaの場合

一方、 x is not a 類似している x != a そして not x is a.

そしてあなたが言ったように、x == 5ではないことはあなたにある種のエラーを与えるでしょう