Python中使用any函数未打印预期内容,仅输出3的问题咨询
Python中
any结合生成器的运行逻辑问题 问题复现场景
我在测试Python内置函数any的用法时,遇到了如下情况:
def f(): print(1) return True def g(): print(2) return False if any(lambda x: x() for x in [g, f, f]): print(3)
我原本预期运行代码后会得到如下输出:
2 3
或是如下输出:
2 1 3
但实际运行后仅得到如下输出:
3
核心原因拆解
- 你写的生成器表达式并没有真的调用
g、f函数,只是在遍历列表元素时,每次返回一个新建的lambda函数对象。整个生成器的产出物是三个可调用的lambda对象,不是函数执行后的返回值。 - Python中所有可调用对象(包括函数、lambda)的布尔判定默认都是True,不存在“假值”的可调用对象。
any的触发逻辑是逐一遍历可迭代对象的元素,只要碰到布尔值为True的元素就立刻短路返回True,不会继续遍历后续元素。
对应到你的代码里,any拿到第一个生成器产出的lambda对象时,就已经判定为真值,直接返回True进入if分支,全程没有执行任何lambda内部的逻辑,自然不会打印1、2的内容。
正确的实现写法
如果要达到“依次执行列表中的函数,遇到第一个返回True的函数就停止遍历、进入if分支”的预期,不需要额外套lambda,直接在生成器表达式里写调用逻辑即可:
def f(): print(1) return True def g(): print(2) return False if any(x() for x in [g, f, f]): print(3)
修改后运行输出和最初的预期完全匹配:
2 1 3
内容的提问来源于stack exchange,提问作者AsukaMinato
相关产品推荐
相关产品推荐

