【问题标题】:Why yielding itertools.islice produce an unusable nested object?为什么产生 itertools.islice 会产生一个不可用的嵌套对象?
【发布时间】: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,为什么我们肯定不想通过生成器来处理这个问题。

【问题讨论】:

    标签: python generator slice


    【解决方案1】:

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

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

    yield from 需要 Python 3.3 或更高版本。您也可以只返回切片:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2020-01-16
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多