当运行下面描述的代码时,我得到一个有趣的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配置)?
答案 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.