我正在尝试使用send
和itertools.tee拆分生成器。虽然这适用于没有send
的生成器,但此示例会产生以下错误:
AttributeError:'itertools._tee'对象没有属性'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)
是否有任何解决方法或其他方法来拆分生成器。 (列表或不使用生成器不是一个选项)
答案 0 :(得分:1)
是否有任何解决方法或其他方法来拆分生成器。
常规(单向)生成器可以使用itertools.tee()或纯python等效函数轻松工作。
但是,双向生成器(使用g.send(x)
推送数据并使用x = yield y
接收数据)不可拆分。
原因是类似T恤的分裂基本上缓冲了先前报告的结果,以便在每次分离时重复使用。但是双向迭代器无法重用以前的结果,因为它发送的新值会影响将来的调用。
因此,当你可以从任何一个分裂流中推送数据时,分割流的整个概念就没有意义了。每个分裂流都可以进入不同的地方。
答案 1 :(得分:-1)
List<Integer> list = new ArrayList<Integer>(Arrays.asList(keys));
的代码先生成,然后再接受i()
。这意味着您需要先调用x
,然后调用next()
。