0

以下の条件は同じ結果になります。それらの間にパフォーマンス(またはその他)の違いはありますか?

1.

if (x != None) and (y != None):
    # Proceed

2.

if (x and y) is not None:
    # Proceed
4

5 に答える 5

9
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
于 2013-10-16T09:50:10.990 に答える
6

あるプログラマーの妻が彼に尋ねました: 朝食にソーセージとベーコンのどちらを食べますか? -はい、彼は答えます。(本当の話)。

日常会話でブール構造を使用する場合、一般的な部分をスキップする傾向があるため、次のように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
>>> 
于 2013-10-16T10:25:10.547 に答える
4

本当の違いを理解するには、何をしているのかを理解する必要があります。

>>> if (x and y) is not None:

単純な条件文ではありません。ここでは、最初に見つけ(x and y)た最後のTruthy値または最初に見つけたFalsey値を返すものを評価し、それを と比較しis not Noneます。これにより、予期しない結果が生じることがあります。(との特異な性質をand参照or)

の両方 がそうでないことを確認したい場合は、次のようにする必要があります。xyNone

>>> 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 番目のステートメントは時々うまくいくかもしれませんが、おそらくあなたが予期していなかった何かをしているのです。

于 2013-10-16T09:53:51.380 に答える
0

いつもの

if x and y:
    #Proceed

Pythonの世界では十分です。

ほとんどの場合、関数は False と None を返すべきではありませんが、関数ロジックでは異なる意味を持っているため、ここで十分だと言います。

それらの反対票を投じた人のために、真剣に、次のコードを現実の世界で書きますか?

if x is None:
    #xxx
elif x == False:
    #xxxx
else:
    #xxx

両方の例はPythonicではなく、避けるべきであることを指摘したいだけです。

于 2013-10-16T09:51:38.727 に答える
0

「である」および「ではない」は、同一性をチェックする (つまり、ポインター/参照を比較する) ため高速です。

他の比較と論理演算子は、オブジェクトの値 (または真実性) を検査します。

通常、「None」値をチェックするには、「is」/「is not」を使用します。

個人的には、式の None 値の動作に依存することは悪い形式であることがわかりました (他の多くの言語で NullPointerException または同様のエラーを引き起こすことがよくあります)。私が書いた同様のコードは次のようになります。

if x is not None and y is not None:
于 2013-10-16T10:09:35.883 に答える