我有两个具有以下签名的生成器:
gen1(inputs) -> Iterator[A]
gen2(Iterator[A]) -> Iterator[B]
我的目标是编写另一个生成器(我们称之为final_gen
),它可以给出A
和B
。
然而,如果我将gen1
和gen2
链接在一起,如下所示:
def final_gen(inputs):
yield from gen2(gen1(inputs))
gen1
将被消耗,我无法获取 A
。
想知道在 Python 中 “重用” gen1
的方式是什么?
更新 我能想到几种方法,但都不满意
- 将
gen1
收集到元组或列表中,以便使用这些值。这样会浪费内存。 - 使用
itertools.tee
创建gen1
的克隆。然而,这会浪费计算资源。
list
或tuple
),要么使用tee
函数将其分成两个独立的生成器。 - Silvio Mayologen2
是否进行表格化/累加/幂等操作?您可以将它们逐个传递给gen2
:(gen1(inputs) 中的每个项目 gen2(item))
。为什么它们是生成器?与函数有何区别? - John Mee((next(gen2([item])), item) for item in gen1(inputs))
。在传递给gen2
之前,我需要将item
包装成一个列表,并调用next
,以遵循gen2
的签名。 - Hongtao Yang