为什么让itertools.islice产生一个不可用的嵌套对象?

时间:2016-12-14 13:23:34

标签: python generator slice

我试图将发电机分成多个部分,这样我就可以做一些平行计算。主要生成器由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,为什么我们肯定不想通过生成器来处理此问题。

1 个答案:

答案 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)