【问题标题】:Using next() on generator function在生成器函数上使用 next()
【发布时间】:2018-11-07 10:40:18
【问题描述】:

我有这个生成器功能:-

def gen():
    for i in range(3):
        yield i*i

现在当我在gen() 上调用next() 时,它每次都给出第一个元素。

>>> next(gen())
0
>>> next(gen())
0

但是当我在 for 循环中使用它时,它会按预期工作:

>>> for i in gen():
...     print(i)
... 
0
1
4

有人可以解释造成这种影响的原因以及我在这里缺少的概念吗?

【问题讨论】:

    标签: python python-3.x generator next


    【解决方案1】:

    每次调用 gen() 时,您的函数都会返回一个新的生成器。

    我认为最简单的理解方法是对比你在做什么:

    >>> next(gen())
    0
    >>> next(gen())
    0
    

    用这个:

    >>> my_gen = gen()
    >>> next(my_gen)
    0
    >>> next(my_gen)
    1
    >>> next(my_gen)
    4
    >>> next(my_gen)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    在后一种情况下,我从 same 生成器获取新值。

    【讨论】:

    • >每次调用 gen() 时,您的函数都会返回一个新的生成器。好吧,那么生成器函数直接不是生成器,直到它被初始化,但是为什么呢?
    • @edam 想一想:如果生成器函数总是返回相同的生成器,这将不是很有用。如果你想创建一个新的生成器,你必须编写一个新函数。如需参考,请参阅文档:generator (function):"A function which return a generator iterator."
    【解决方案2】:

    每次调用该函数时,它都会返回一个生成器对象。每次调用下一个时,您都会得到第一项,即0 * 0,因为您没有在同一个对象上调用下一个(每次都是一个新对象)。但在第二种情况下,您正在循环一个生成器对象,它将继续消耗生成器,直到它到达StopIteration

    为了更好地演示,您可以从生成器函数创建两个迭代器对象并同时循环它们:

    In [17]: g = gen()
    
    In [18]: k = gen()
    
    In [19]: for i, j in zip(g, k):
        ...:     print(i, j)
        ...:     
    0 0
    1 1
    4 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2012-08-29
      • 2021-07-12
      相关资源
      最近更新 更多