假设我有一个带有副作用的函数(在示例中,副作用是打印了一些东西)。是否有任何版本的any()或列表可迭代的任何构造,在找到True结果后不会触发副作用?]
示例,假设此功能:
def a(x):
print("A function got: " + str(x))
return x == 2
一个可能希望,此调用可以解决问题。当然,它不是:
any([
a(i) for i in range(5)
])
哪些印刷品:
A function got: 0
A function got: 1
A function got: 2
A function got: 3
A function got: 4
但是我希望它改为打印此:
A function got: 0
A function got: 1
A function got: 2
为什么? Range是一个可迭代的,列表推导产生一个可迭代的,我会期望Python将它们链接在一起,并在any()函数停止消耗后立即停止执行整个事情,一旦到达第一个True,就应该这样做。
我有什么误会?如果有此版本,它将以这种方式运行吗?
无论何时使用列表,都会评估所有值。获得惰性评估的唯一方法是将其保留为生成器:
您可以通过在列表理解中添加条件来使用以下代码