为什么 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)
我正在尝试将生成器分成多个部分,以便进行一些并行计算。主生成器由 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)