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

标签 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 配置)?

最佳答案

Python 使用 short-circuit evaluation这意味着在表达式中

flag and some_func()
如果 flag 为 False,

some_func() 将永远不会被执行,因为 some_func() 的结果不会改变结果(无论 x 的值如何,False and x 始终为 False)。

编辑:如果您颠倒顺序:

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() 代替 来评估所有参数:

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

关于python - 函数未执行(逻辑语句的一部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49967061/

相关文章:

python - 了解可变变量的函数作用域

python - Tkinter GUI 卡住

python - 使用 Mechanize 搜索 Pastbin.com

python - 如何识别缺失索引

Python- Pandas : get row indices for a particular value in a column

python - 如何创建与 python 中现有目录内容相同的目录的 "in memory"副本

python - 为什么我不能在 Python 3 中使用 `print __doc__`?

python - 从 Google DataStore 打印多个二进制数据字段?

python - 由于 AKI DirName 扩展 : Python [SSL: CERTIFICATE_VERIFY_FAILED] . 在 openSSL 中找到根本原因 ..:无法获取本地颁发者证书

python - django-rest-framework-gis GeoFeatureModelSerializer 在序列化时返回更改/不正确的坐标