gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:13 26 4
gpt4 key购买 nike

我正在尝试将生成器分成多个部分,以便进行一些并行计算。主要的生成器是由 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)) 获取第一个元素一次,但如果您再次尝试,则会产生错误。应用于 gslicelist() 不会列出任何内容,只会返回相同的对象。

这篇文章的目标基本上是询问为什么 gslice 不简单地生成一个生成器,它是 g 的一个子集,并且询问如何做到这一点。想象一下,如果我将 product 方法中的 repeat=2 更改为 repeat=10,为什么除了通过我们会生成发电机。

最佳答案

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)

关于python - 为什么 yield itertools.islice 会产生一个不可用的嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41143773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com