开发者

python boolean expression not "short-circuit"?

开发者 https://www.devze.com 2023-01-27 22:26 出处:网络
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:

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

精彩评论

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