我试图将发电机分成多个部分,这样我就可以做一些平行计算。主要生成器由g()
生成,gslice()
应该生成它的子类并将其用于程序的其余部分:
>>> 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
的子类的生成器,并且还要问如何做到这一点。成像,如果我将repeat=2
方法中的product
更改为repeat=10
,为什么我们肯定不想通过生成器来处理此问题。
答案 0 :(得分: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)