开发者

python boolean expression not "short-circuit"?

For example:

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

I thought the above code should ou开发者_开发百科tput:

foo
bar

instead of :

foo
foo
foo
bar

Why ? how can I make the "short-circuit" effect ?


Deconstruct your program to see what is happening:

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

You are already creating a list and passing to any and have printed it 3 times.

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

This is fed to if statement:

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

Solution: Pass a generator to any

>>> (f() for f in [foo]*3)
<generator object <genexpr> at 0x10041a9b0>


It's creating the list before passing it to any

try

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

this way only a generator expression is created, so only as many terms as necessary are evaluated.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜