たとえば、次のステートメントがあるとします。
if( foo1 or foo2)
...
...
foo1 が true の場合、python は foo2 の状態をチェックしますか?
たとえば、次のステートメントがあるとします。
if( foo1 or foo2)
...
...
foo1 が true の場合、python は foo2 の状態をチェックしますか?
はい、Python はブール条件を遅延して評価します。
式 x および y は、最初に x を評価します。x が false の場合、その値が返されます。それ以外の場合、y が評価され、結果の値が返されます。
式 x または y は最初に x を評価します。x が true の場合、その値が返されます。それ以外の場合、y が評価され、結果の値が返されます。
and
or
怠け者です
&
|
怠け者ではない
これは技術的に遅延評価ではなく、短絡ブール式です。
遅延評価には、多少異なる意味合いがあります。たとえば、真の遅延評価では、これが可能になる可能性があります
def foo(arg) :
print "Couldn't care less"
foo([][0])
しかし、Python はそうではありません。
Python は、ブール値の引数を「エコー」するという点でも優れています。たとえば、or 条件は、最初の「真の」引数または最後の引数 (すべての引数が「false」の場合) のいずれかを返します。and 条件はその逆です。
したがって、「エコー引数」ブール値は意味します
2 と [] と 1
[] に評価され、
[] または 1 または 2
1に評価されます
短いデモは、時間差を比較することです
all(xrange(1,1000000000))
と
any(xrange(1,1000000000))
all() はすべての単一の値をチェックする必要がありますが、any() は最初の True が見つかった後にあきらめることができます。したがって、ジェネレーターである xrange も、エバリュエーターが完了するとすぐに生成をあきらめます。このため、all は大量の RAM を消費し、時間がかかりますが、any は数バイトしか使用せず、すぐに戻ります。
はい、Python は遅延評価するため、foo2
チェックされません。
キーが存在するかどうかわからない場合、辞書のようなオブジェクトからアイテムを取得するためにこれを常に使用します。
if 'key' in mydict and mydict['key'] == 'heyyo!':
do_stuff()
詳細な説明については、@unutbu の回答を参照してください。
実際にor
短絡しているのは次の部分です。
>>> 1 or 1/0 #also 0 and 1/0
1
>>> 0 or 1/0 #also 1 and 1/0
Traceback (most recent call last):
File "<pyshell#1240>", line 1, in <module>
0 or 1/0
ZeroDivisionError: integer division or modulo by zero