【发布时间】:2020-05-19 09:56:28
【问题描述】:
假设我有一个带有副作用的函数(在示例中,副作用是打印了一些东西)。是否有任何版本的 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 就应该这样做.
我误会了什么?如果有的话,哪个版本的 this 会以这种方式运行?
【问题讨论】:
-
嗯...不要使用列表推导式?
-
呼叫
any(a(i) for i in range(5)),没有[和]。使用括号,您正在创建一个列表推导,因此首先它创建一个包含生成器生成的所有元素的列表,然后将其传递给any。如果没有括号,any只会根据需要在生成器中迭代尽可能多的元素。 -
哇。这建筑太棒了!我不知道。我现在要到处使用它。几个方括号有什么不同。大吃一惊。您可以将其粘贴为@jdehesa 的答案吗?
-
@BillHuneke 没关系,把已经发帖的那张当作已接受,不用重复答案。