2016-12-14 5 views
2

私はいくつかの並列演算を行うことができるように、複数の部分にジェネレータを分割しようとしています。 、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()をsplitingの:主発電機はg()によって生成され、gslice()が、それのsubestを生成し、使用するプログラムの残りのためにそれをもたらすことになっているがあります最初の要素をnext(next(a))で1回取ることができる何らかのネストしたオブジェクトitertools.isliceを返していますが、もう一度やり直すとエラーが発生します。 list()gsliceに適用されても、同じオブジェクトを返す以外は何も表示されません。

この投稿の目的は、gsliceがサブタイトルのgである発電機を単に生産しない理由とそれを行う方法を尋ねることです。私がの方法でrepeat=2productの方法に変更すると、なぜジェネレーター以外でこれを処理したくないのでしょうか?

答えて

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) 
関連する問題