私はいつもこれらを好んだ。
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ではないことはあなたにある種のエラーを与えるでしょう