例えば:
def foo():
print 'foo'
return 1
if any([f() for f in [foo]*3]):
print 'bar'
私は上記のコードが出力するはずだと思いました:
foo
bar
それ以外の :
foo
foo
foo
bar
なんで ?どうすれば「短絡」効果を得ることができますか?
例えば:
def foo():
print 'foo'
return 1
if any([f() for f in [foo]*3]):
print 'bar'
私は上記のコードが出力するはずだと思いました:
foo
bar
それ以外の :
foo
foo
foo
bar
なんで ?どうすれば「短絡」効果を得ることができますか?
プログラムを分解して、何が起こっているかを確認します。
>>> [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>
いずれかに渡す前にリストを作成しています
試す
def foo():
print 'foo'
return 1
if any(f() for f in [foo]*3):
print 'bar'
この方法では、ジェネレータ式のみが作成されるため、必要な数の用語のみが評価されます。