使用 itertools.tee 发送到生成器
Use send to generator with itertools.tee
我正在尝试用 send
和 itertools.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 恤的拆分基本上缓冲了先前报告的结果,以便在每个拆分中重复使用。但是双向迭代器不能重用以前的结果,因为它正在发送可能影响未来调用的新值。
因此,当您可以将数据从每个可以前进到不同位置的任一拆分流推回时,拆分流的整个概念就不再有意义了。
我正在尝试用 send
和 itertools.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 恤的拆分基本上缓冲了先前报告的结果,以便在每个拆分中重复使用。但是双向迭代器不能重用以前的结果,因为它正在发送可能影响未来调用的新值。
因此,当您可以将数据从每个可以前进到不同位置的任一拆分流推回时,拆分流的整个概念就不再有意义了。