80

たとえば、次のステートメントがあるとします。

if( foo1 or foo2)
    ...
    ...

foo1 が true の場合、python は foo2 の状態をチェックしますか?

4

7 に答える 7

103

はい、Python はブール条件を遅延して評価します。

ドキュメントによると、

式 x および y は、最初に x を評価します。x が false の場合、その値が返されます。それ以外の場合、y が評価され、結果の値が返されます。

式 x または y は最初に x を評価します。x が true の場合、その値が返されます。それ以外の場合、y が評価され、結果の値が返されます。

于 2012-12-19T20:32:06.607 に答える
60

and or怠け者です

& |怠け者ではない

于 2016-05-20T08:59:50.267 に答える
6

これは技術的に遅延評価ではなく、短絡ブール式です。

遅延評価には、多少異なる意味合いがあります。たとえば、真の遅延評価では、これが可能になる可能性があります

def foo(arg) :
    print "Couldn't care less"

foo([][0])

しかし、Python はそうではありません。

Python は、ブール値の引数を「エコー」するという点でも優れています。たとえば、or 条件は、最初の「真の」引数または最後の引数 (すべての引数が「false」の場合) のいずれかを返します。and 条件はその逆です。

したがって、「エコー引数」ブール値は意味します

2 と [] と 1

[] に評価され、

[] または 1 または 2

1に評価されます

于 2013-10-19T21:17:56.533 に答える
3

短いデモは、時間差を比較することです

all(xrange(1,1000000000))

any(xrange(1,1000000000))

all() はすべての単一の値をチェックする必要がありますが、any() は最初の True が見つかった後にあきらめることができます。したがって、ジェネレーターである xrange も、エバリュエーターが完了するとすぐに生成をあきらめます。このため、all は大量の RAM を消費し、時間がかかりますが、any は数バイトしか使用せず、すぐに戻ります。

于 2016-05-27T11:07:44.477 に答える
2

はい、Python は遅延評価するため、foo2チェックされません。

キーが存在するかどうかわからない場合、辞書のようなオブジェクトからアイテムを取得するためにこれを常に使用します。

if 'key' in mydict and mydict['key'] == 'heyyo!':
    do_stuff()

詳細な説明については、@unutbu の回答を参照してください。

于 2012-12-19T20:33:42.910 に答える
1

実際に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
于 2013-10-19T21:34:14.663 に答える