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

Why yielding itertools.islice produce an unusable nested object?

我正在尝试将生成器分成多个部分,以便进行一些并行计算。主生成器由 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,您可以使用 [=17 获取第一个元素一次=] 但如果你再试一次,它会产生一个错误。 list() 应用于 gslice 除了 return 同一个对象之外没有列出任何东西。

这个 post 的目标基本上是问为什么 gslice 不简单地产生一个生成器是 g 的子元素,并且还问如何做到这一点。想象一下,如果我将 product 方法中的 repeat=2 更改为 repeat=10,为什么我们肯定不想通过生成器来处理这个问题。

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

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

yield from 需要 Python 3.3 或更新版本。您也可以 return 切片:

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