以下の条件は同じ結果になります。それらの間にパフォーマンス(またはその他)の違いはありますか?
1.
if (x != None) and (y != None):
# Proceed
2.
if (x and y) is not None:
# Proceed
以下の条件は同じ結果になります。それらの間にパフォーマンス(またはその他)の違いはありますか?
1.
if (x != None) and (y != None):
# Proceed
2.
if (x and y) is not None:
# Proceed
In [44]: x = False
In [45]: y = None
In [46]: (x != None) and (y != None)
Out[46]: False
In [47]: (x and y) is not None
Out[47]: True
ちなみに、何かがNoneかどうかをテストするときは、テストする方が良いです
if x is None
それよりも
if x == None
結果は異なる場合があります。
class Egalitarian(object):
def __eq__(self, other):
return True
x = Egalitarian()
print(x == None)
# True
print(x is None)
# False
あるプログラマーの妻が彼に尋ねました: 朝食にソーセージとベーコンのどちらを食べますか? -はい、彼は答えます。(本当の話)。
日常会話でブール構造を使用する場合、一般的な部分をスキップする傾向があるため、次のようにX(Y) @ X(Z)
なりX @ (Y,Z)
ます。
Her bunny is happy and her hamster is happy (1)
と同じです
Her bunny and her hamster are happy
しかし、プログラミングでは、そのようなことを縮約することはできません。最初の声明
bunny == happy and hamster == happy
両方のペットが正常である場合は true になります。2 番目のフレーズは、文字通り次のように訳されます。
(bunny and hamster) == happy
ここで、(bunny and hamster)
評価すると
- a falsy value, if she's got no bunny
- the hamster otherwise
したがって、(bunny and hamster) == happy
実際には次のようになります。
She's got a bunny and her hamster is happy
これは、ステートメント (1) とはかなり異なります。
パイソンでは:
>>> happy = 1
>>> sad = 2
>>> bunny = sad
>>> hamster = happy
>>> bunny == happy and hamster == happy
False
>>> (bunny and hamster) == happy
True
>>>
本当の違いを理解するには、何をしているのかを理解する必要があります。
>>> if (x and y) is not None:
単純な条件文ではありません。ここでは、最初に見つけ(x and y)
た最後のTruthy値または最初に見つけたFalsey値を返すものを評価し、それを と比較しis not None
ます。これにより、予期しない結果が生じることがあります。(との特異な性質をand
参照or
)
との両方 がそうでないことを確認したい場合は、次のようにする必要があります。x
y
None
>>> if all(var is not None for var in [x, y]):
これは、次とほぼ同じです。
>>> if x is not None and y is not None:
少しだけ読みやすく、より堅牢です (チェックする変数を追加した場合)。
いずれにせよ、2 つのステートメントの違いは、最初のステートメントは実際に期待どおりに動作することですis not
が!=
、None
. そして、2 番目のステートメントは時々うまくいくかもしれませんが、おそらくあなたが予期していなかった何かをしているのです。
いつもの
if x and y:
#Proceed
Pythonの世界では十分です。
ほとんどの場合、関数は False と None を返すべきではありませんが、関数ロジックでは異なる意味を持っているため、ここで十分だと言います。
それらの反対票を投じた人のために、真剣に、次のコードを現実の世界で書きますか?
if x is None:
#xxx
elif x == False:
#xxxx
else:
#xxx
両方の例はPythonicではなく、避けるべきであることを指摘したいだけです。
「である」および「ではない」は、同一性をチェックする (つまり、ポインター/参照を比較する) ため高速です。
他の比較と論理演算子は、オブジェクトの値 (または真実性) を検査します。
通常、「None」値をチェックするには、「is」/「is not」を使用します。
個人的には、式の None 値の動作に依存することは悪い形式であることがわかりました (他の多くの言語で NullPointerException または同様のエラーを引き起こすことがよくあります)。私が書いた同様のコードは次のようになります。
if x is not None and y is not None: