重用生成器的最Pythonic方式?

Hon*_*ang 5 python generator

我有两个具有以下签名的生成器:

  • gen1(inputs) -> Iterator[A]
  • gen2(Iterator[A]) -> Iterator[B]

我的目标是编写另一个生成器(我们称之为final_gen),它同时提供AB

但是,如果我将gen1和链接gen2在一起,就像

def final_gen(inputs):
    yield from gen2(gen1(inputs))
Run Code Online (Sandbox Code Playgroud)

gen1会被消耗而我无法回来A

只是想知道“重用”的Pythonic方式是什么gen1

更新 我可以想到一些方法,但我不满意任何一个

  1. 收集gen1到元组或列表中,以便我可以使用这些值。这是内存效率低下的。
  2. 用于itertools.tee创建 的克隆gen1。然而,这是计算效率低下的。

Bas*_*hur 1

我正在考虑组合itertools.tee()复制您的输入,然后将其包装到另一个函数中,该函数返回两个生成器链的结果。

与此类似的东西(如itertools 的食谱中所示)

def partition(pred, iterable):
    "Use a predicate to partition entries into false entries and true entries"
    # partition(is_odd, range(10)) --> 0 2 4 6 8   and  1 3 5 7 9
    t1, t2 = tee(iterable)
    return filterfalse(pred, t1), filter(pred, t2)
Run Code Online (Sandbox Code Playgroud)