在生成器函数上使用 next()

Vic*_*bot 10 python generator python-3.x

我有这个生成器功能:-

def gen():
    for i in range(3):
        yield i*i
Run Code Online (Sandbox Code Playgroud)

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

>>> next(gen())
0
>>> next(gen())
0
Run Code Online (Sandbox Code Playgroud)

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

>>> for i in gen():
...     print(i)
... 
0
1
4
Run Code Online (Sandbox Code Playgroud)

有人可以解释这种效果的原因以及我在这里缺少的概念吗?

Sam*_*eau 13

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

我认为最简单的理解方法就是对比你正在做的事情:

>>> next(gen())
0
>>> next(gen())
0
Run Code Online (Sandbox Code Playgroud)

有了这个:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

  • @edam 想一想:如果生成器函数总是返回相同的生成器,那么它不会很有用。如果您想创建一个新的生成器,则必须编写一个新函数。作为参考,请参阅文档:[生成器(函数)](https://docs.python.org/3/glossary.html#term-generator):*“返回[生成器迭代器](https://docs.python.org/3/glossary.html#term-generator)的函数/docs.python.org/3/glossary.html#term-generator-iterator)."* (2认同)

Kas*_*mvd 6

每次调用该函数时,它都会返回一个生成器对象。每次您在其上调用下一个时,您都会获得第一个项目,这是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
Run Code Online (Sandbox Code Playgroud)