2
我想把一个发生器分成多个部分,所以我可以做一些并行计算。还有就是主发电机由g()
和gslice()
生产应该产生它的subest和产生它的程序的其余部分使用:为什么产生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()
,正在产生某种嵌套对象itertools.islice
,您可以使用next(next(a))
取第一个元素,但如果再次尝试,则会产生错误。 list()
适用于gslice
不会列出任何内容,但会返回相同的对象。
这篇文章的目标基本上是问为什么gslice
不会简单地产生一个g
的子版本的发生器,也可以询问如何做到这一点。如果我将product
方法中的repeat=2
更改为repeat=10
,那么为什么我们肯定不想通过发生器处理这个问题。