2016-12-14 56 views
2

我想把一个发生器分成多个部分,所以我可以做一些并行计算。还有就是主发电机由g()gslice()生产应该产生它的subest和产生它的程序的其余部分使用:为什么产生itertools.islice产生不可用的嵌套对象?

>>> from itertools import product 
>>> from string import digits 
>>> def g(): 
...  for i in product(digits, repeat=2): 
...   yield "".join(['aa']+list(i)) 

>>> def gslice(): 
...  yield itertools.islice(g(), 3,4) 

>>> a=gslice() 
>>> next(a) 
<itertools.islice object at 0x7fc4dc34ad60> 
>>> next(next(a)) 
'aa03' 
>>> next(next(a)) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 

不幸的是,你可以看到itertools.islice,而不是劈裂g(),正在产生某种嵌套对象itertools.islice,您可以使用next(next(a))取第一个元素,但如果再次尝试,则会产生错误。 list()适用于gslice不会列出任何内容,但会返回相同的对象。

这篇文章的目标基本上是问为什么gslice不会简单地产生一个g的子版本的发生器,也可以询问如何做到这一点。如果我将product方法中的repeat=2更改为repeat=10,那么为什么我们肯定不想通过发生器处理这个问题。

回答

2

islice()本身就是一个迭代器(就像一个生成器是一个迭代器)。如果你想产生结果片,你可以使用yield from

def gslice(): 
    yield from itertools.islice(g(), 3, 4) 

yield from需要Python 3.3或更高版本。您也可以只需返回切片:

def gslice(): 
    return itertools.islice(g(), 3, 4)