2017-03-16 39 views
1

我想分割发生器与senditertools.tee。尽管这适用于发电机没有send,这个例子产生以下错误:使用send与itertools.tee发生器

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) 

有任何解决方法或其他方法来分割发电机。 (使用发电机制作清单或不使用发电机不是一个选项)

回答

1

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

定期(单向)发电机可以很容易地与itertools.tee()或纯粹的python等价物一起工作。

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

原因是T形分裂本质上缓冲了先前报告的结果,以便在每个分裂点上重新使用。但是双向迭代器不能重用以前的结果,因为它发送的值会影响将来的调用。

因此,当您可以将数据从任何一个可以分别推进到不同位置的分流中推回时,分流的整个概念将停止有意义。

-1

您的代码为i()首先得到,然后接受x稍后。这意味着您需要先致电next(),然后再致电send()

+0

我一直在尝试交换'next()'和'send',但这似乎不起作用。你能举个例子吗? –

+0

我不能,我从来没有写过同时产出和接受产出的代码。我所做的只是采取你的榜样,先尝试'next()',然后'send()' –

+0

我值得反对。我以为我会评论你的帖子,但忘了,并将其作为一个答案:( –

相关问题