Python any函数执行逻辑疑问:是否提前终止?如何避免全列表构建?
关于Python中
any()与列表推导式的执行逻辑问题 执行逻辑说明
你给出的代码any([condition(element) for element in some_list])会先执行场景1的逻辑:先遍历some_list的所有元素,逐一调用condition(element)生成完整的布尔值列表,之后再将这个列表传给any()函数。Python不会将这个写法优化为场景2的惰性执行,因为列表推导式的本质就是立即生成完整集合,不管后续是否需要用到所有元素。
避免构建完整列表的替代方案
除了显式编写循环外,最简洁的方式是用生成器表达式替代列表推导式,只需要把列表推导式的方括号[]改成圆括号()(甚至可以省略圆括号,因为any()可以直接接收生成器表达式作为参数):
any(condition(element) for element in some_list)
生成器表达式采用惰性求值策略:它不会提前生成所有元素的布尔值,而是在any()函数迭代它时,才逐个计算condition(element)的值。一旦某个元素的计算结果为True,any()会立即停止迭代并返回True,完全符合场景2的执行逻辑。
内容的提问来源于stack exchange,提问作者cyanide
相关产品推荐
相关产品推荐

