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

时间:2018-05-28 20:29:23

标签: python python-3.x generator next

我有这个生成器功能: -

>>> 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

有人可以解释这种影响的原因;和我在这里失踪的概念??

2 个答案:

答案 0 :(得分:3)

每次调用该函数时,它都会返回一个生成器对象。每当你打电话给下一个时,你就会得到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

答案 1 :(得分:2)

每次拨打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

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