2016-12-14 57 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)