Python嵌套生成器不工作

2024-09-28 23:31:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在练习生成器,我想知道为什么下面的代码不打印16对而只打印4对。在

def range_generator_function(my_range):
    for i in my_range:
        yield i

gen1=range_generator_function(range(1,5))
gen2=range_generator_function(range(1,5))

def pairs_generator_function(gen1,gen2):
    for it1 in gen1:
        for it2 in gen2:
            yield [it1,it2]

my_gen = pairs_generator_function(gen1,gen2)

for it in my_gen:
    print(it)

输出是

^{pr2}$

而我期望的输出是

^{3}$

Tags: informydefrangeitfunctiongenerator
3条回答

你在第一次通过内环后耗尽了第二代。该流中不再有任何内容,因此it1的其他三个值没有任何可与之配对的值。每次通过时都需要重新启动gen2。考虑使用itertools.tee来克隆更多副本。在

您得到的输出是由于在第二次迭代中,生成器gen2已经用尽。在

您可以在循环之前用它生成一个list来存储它的输出,或者在每次迭代中用itertools.tee来复制它。前者不能处理无限的生成器,但是在实现后者之前,让我指出您实际上是在重新实现itertools.product。在

from itertools import product

my_gen = product(gen1, gen2)

for it in my_gen:
    print(it)

实际输出正确。您的gen2实例已被第一个内部循环完全耗尽:

def pairs_generator_function(gen1,gen2):
    for it1 in gen1:
        for it2 in gen2:  # <--- this consumes gen2
            yield [it1,it2]

在随后的迭代中,再次迭代gen2为空。在

相关问题 更多 >