【问题标题】:python boolean expression not "short-circuit"?python布尔表达式不是“短路”?
【发布时间】:2011-05-17 03:50:05
【问题描述】:

例如:

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] 列表推导执行并创建f() 返回值列表之前 any() 有机会评估它们(和短路)。

标签: python short-circuiting


【解决方案1】:

它在将列表传递给任何对象之前创建列表

试试

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

这样只创建了一个生成器表达式,因此只计算所需数量的项。

【讨论】:

    【解决方案2】:

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

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

    您已经创建了一个列表并传递给 any 并打印了 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>
    

    【讨论】:

    • 非常适合python!还有什么比这更简单的!
    猜你喜欢
    • 2019-08-27
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多