使用 itertools.tee 发送到生成器

Use send to generator with itertools.tee

我正在尝试用 senditertools.tee 拆分生成器。虽然这适用于没有 send 的生成器,但此示例会产生以下错误:

AttributeError: 'itertools._tee' object has no attribute 'send'

from itertools import tee


def i():
    for j in range(10):
        yield j
        x = yield


k = i()
k.send(None)
next(k)

l1, l2 = tee(k)
next(l1)
l1.send(None)

是否有任何解决方法或其他方法来拆分生成器。 (制作列表或不使用生成器不是这里的选项)

您的 i() 代码首先生成,然后再接受 x。这意味着您需要先调用 next(),然后调用 send().

Is there any workaround or other methods to split a generator.

常规(单向)生成器可以轻松地与 itertools.tee() 或纯 python 等价物一起使用。

但是,双向生成器(您使用 g.send(x) 推送数据并使用 x = yield y 接收数据)不可拆分。

原因是类似 T 恤的拆分基本上缓冲了先前报告的结果,以便在每个拆分中重复使用。但是双向迭代器不能重用以前的结果,因为它正在发送可能影响未来调用的新值。

因此,当您可以将数据从每个可以前进到不同位置的任一拆分流推回时,拆分流的整个概念就不再有意义了。