gpt4 book ai didi

python - 嵌套生成器表达式的行为异常

转载 作者:IT老高 更新时间:2023-10-28 20:43:14 26 4
gpt4 key购买 nike

使用以下代码:

A = [1, 2]
B = [-2, -1]
C = [-1, 2]
D = [0, 2]

ab = (a + b for a in A for b in B)
cd = (c + d for c in C for d in D)
abcd = (e_ab + e_cd for e_ab in ab for e_cd in cd)

len(abcd) 应该是 16,但实际上是 4。如果我改用列表推导,问题就消失了。这是为什么呢?

最佳答案

您只能乘坐一次发电机列车,到达目的地后,不能再乘坐。在您的情况下, cd 生成器已用尽,然后无法再次迭代。

另一方面,

list 对象创建一个单独的迭代器对象每次您在它们上调用 iter(其中 for 循环隐含地为你做):

print(iter([1, 2, 3]))
# <list_iterator at 0x7f18495d4c88>

并生成一个您可以使用的新迭代器。这会发生任何时候 iter 在其上被调用;由于每次都会生成一个新对象,因此您可以多次浏览列表。多次骑行!

简而言之,如果你cd改成一个列表(一般来说就是要迭代多次的对象):

ab = (a + b for a in A for b in B)
cd = [c + d for c in C for d in D] # list-comp instead

它将通过从 cdab 中的每个元素创建新的迭代器对象来产生所需的结果:

abcd = (e_ab + e_cd for e_ab in ab for e_cd in cd)
print(len(list(abcd)))
# 16

当然,您也可以通过使用 itertools 中的 product 来实现这一点,但这超出了发生这种情况的意义。

关于python - 嵌套生成器表达式的行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41561417/

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