使用itertools.tee发送到生成器

时间:2017-03-16 13:26:29

标签: python generator itertools python-3.6

我正在尝试使用senditertools.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)

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

2 个答案:

答案 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()