函数未执行(逻辑语句的一部分)

时间:2018-04-22 14:32:30

标签: python python-3.x

当运行下面描述的代码时,我得到一个有趣的python行为。

显然python解释器进行某种优化并且不运行该函数,因为逻辑语句输出已经知道(False和True仍然等于false)。

def some_func(x):
    print(x)
    return False

flag = True
for x in range(5):
    flag = flag and some_func(x)

输出:

0

预期产出:

0
1
2
3
4

显而易见的解决方案是:

flag = true
for x in range(5):
    temp_flag = some_func(x)
    flag = flag and temp_flag

但是我想知道是否有某种方法来控制解释器优化(或者是这个和IDE配置)?

2 个答案:

答案 0 :(得分:4)

Python使用short-circuit evaluation表示在表达式

flag and some_func()
如果some_func()为False,则永远不会执行

flag,因为some_func()的结果不会改变结果(False and x始终为False,无论值如何of x)。

修改:如果您撤销订单:

flag = some_func() and flag

逻辑不会改变(and是可交换的),但现在some_func()将始终执行。

编辑2:如果您有两个以上的参数,这个简单的技巧将无效。考虑这个例子:

>>> def f(name):
...     print(name)
...     return False
...
>>> f('A') and f('B') and f('C')
A
False

如您所见,执行将停在f('A')

在这种情况下,您可以使用all()代替and来评估所有参数:

>>> all([f('A'), f('B'), f('C')])
A
B
C
False

答案 1 :(得分:2)

你可以在没有显式循环的情况下做同样的事情:

results = [some_func(x) for x in range(5)]  # Collect a list of results.
flag = all(results)  # True if every value in `results` is True.