gpt4 book ai didi

python - 生成器表达式使用生成器创建后分配的列表

转载 作者:IT老高 更新时间:2023-10-28 21:11:27 25 4
gpt4 key购买 nike

我找到了这个示例,但我不明白为什么它的工作方式无法预测?我想它必须输出 [1, 8, 15][2, 8, 22]

array = [1, 8, 15]
g = (x for x in array if array.count(x) > 0)
array = [2, 8, 22]
print(list(g))
# >>> [8]

最佳答案

原因是,在创建时,生成器 (a for b in c if d) 只计算 c(有时使 b 也可预测)。但是 abd 在消耗时间(每次迭代)进行评估。在这里,它在评估 d (array.count(x) > 0)。

例如,您可以这样做:

g = (x for x in [] if a)

没有事先声明a。但是,您必须确保在使用生成器时 a 存在。

但你不能这样做:

g = (x for x in a if True)

根据要求:

您可以使用通用生成器函数观察相似(但不相同)的模式:

def yielder():
for x in array:
if array.count(x) > 0:
yield x

array = [1, 8, 15]
y = yielder()
array = [2, 8, 22]
list(y)
# [2, 8, 22]

生成器函数不会在消耗之前执行其任何主体。因此,即使是 for-loop header 中的 array 也被迟到了。一个更令人不安的例子发生在我们在迭代期间“切换”array:

array = [1, 8, 15]
y = yielder()
next(y)
# 1
array = [3, 7]
next(y) # still iterating [1, 8, 15], but evaluating condition on [3, 7]
# StopIteration raised

关于python - 生成器表达式使用生成器创建后分配的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52968312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com