python布尔表达式不是“短路”?

发布于 2024-10-04 17:23:37 字数 258 浏览 4 评论 0原文

例如:

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

我认为上面的代码应该输出:

foo
bar

而不是:

foo
foo
foo
bar

为什么?如何制作“短路”效果?

For example:

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

I thought the above code should output:

foo
bar

instead of :

foo
foo
foo
bar

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苏璃陌 2024-10-11 17:24:09

它在将列表传递给任何

尝试

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

之前创建列表,这样仅创建生成器表达式,因此仅评估所需数量的术语。

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.

千里故人稀 2024-10-11 17:23:55

解构你的程序看看发生了什么:

>>> [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>

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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文