Python3中的惰性评估

问题描述 投票:0回答:2

假设我有一个带有副作用的函数(在示例中,副作用是打印了一些东西)。是否有任何版本的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,就应该这样做。

我有什么误会?如果有此版本,它将以这种方式运行吗?

python lazy-evaluation
2个回答
2
投票

无论何时使用列表,都会评估所有值。获得惰性评估的唯一方法是将其保留为生成器:


-4
投票

您可以通过在列表理解中添加条件来使用以下代码

© www.soinside.com 2019 - 2024. All rights reserved.