gpt4 book ai didi

python - python 生成器的不一致行为

转载 作者:太空狗 更新时间:2023-10-30 02:32:23 26 4
gpt4 key购买 nike

以下 python 代码生成 [(0, 0), (0, 7)...(0, 693)] 而不是预期的元组列表,其中包含所有 3 的倍数和 7 的倍数:

multiples_of_3 = (i*3 for i in range(100))
multiples_of_7 = (i*7 for i in range(100))
list((i,j) for i in multiples_of_3 for j in multiples_of_7)

此代码解决了问题:

list((i,j) for i in (i*3 for i in range(100)) for j in (i*7 for i in range(100)))

问题:

  1. 生成器对象似乎起到了迭代器的作用,而不是每次枚举生成的列表时都提供一个迭代器对象。 .Net LINQ 查询对象似乎采用了后来的策略。有没有优雅的方法来解决这个问题?
  2. 第二段代码如何工作?我应该理解生成器的迭代器在遍历所有 7 的倍数后不会重置吗?
  3. 您不认为这种行为即使不矛盾也是违反直觉的吗?

最佳答案

生成器对象迭代器,因此是一次性的。它不是可以生成任意数量的独立迭代器的iterable。这种行为不是您可以通过某个地方的开关来改变的,因此任何解决方法都相当于使用可迭代对象(例如列表)而不是生成器或重复构造生成器。

第二个片段执行后者。根据定义,它等同于循环

for i in (i*3 for i in range(100)):
for j in (i*7 for i in range(100)):
...

希望在这里,后一个生成器表达式在外循环的每次迭代中都被重新计算并不奇怪。

关于python - python 生成器的不一致行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18486244/

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