10

例えば:

def foo():
    print 'foo'
    return 1
if any([f() for f in [foo]*3]):
   print 'bar'

私は上記のコードが出力するはずだと思いました:

foo
bar

それ以外の :

foo
foo
foo
bar

なんで ?どうすれば「短絡」効果を得ることができますか?

4

2 に答える 2

18

プログラムを分解して、何が起こっているかを確認します。

>>> [f() for f in [foo]*3]
foo
foo
foo
[1, 1, 1]
>>> 

あなたはすでにリストを作成していずれかに渡し、それを3回印刷しました。

>>> any ([1, 1, 1])
True

これはifステートメントに送られます:

>>> if any([1, 1, 1]):
...     print 'bar'
... 
bar
>>> 

解決策:ジェネレーターを任意の場所に渡します

>>> (f() for f in [foo]*3)
<generator object <genexpr> at 0x10041a9b0>
于 2010-11-29T08:22:35.783 に答える
5

いずれかに渡す前にリストを作成しています

試す

def foo():
    print 'foo'
    return 1
if any(f() for f in [foo]*3):
   print 'bar'

この方法では、ジェネレータ式のみが作成されるため、必要な数の用語のみが評価されます。

于 2010-11-29T08:23:24.133 に答える