【发布时间】:2016-12-14 13:23:34
【问题描述】:
我正在尝试将生成器拆分为多个部分,以便进行一些并行计算。主生成器是由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 子集的生成器,并问如何做到这一点。想象一下,如果我将 product 方法中的 repeat=2 更改为 repeat=10,为什么我们肯定不想通过生成器来处理这个问题。
【问题讨论】: