在生成器函数上使用 next()
Using next() on generator function
我有这个生成器函数:-
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
有人可以解释这种效果的原因以及我在这里缺少的概念吗?
每次调用函数时,它 returns 生成器对象。每次你调用 next 时,你都会得到第一个项目,即 0 * 0
因为你不是在同一个对象上调用 next(每次都是一个新对象)。但在第二种情况下,你循环遍历一个生成器对象,它会继续消耗生成器,直到它达到 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
你的函数 returns 每次你调用 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 生成器获取新值。
我有这个生成器函数:-
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
有人可以解释这种效果的原因以及我在这里缺少的概念吗?
每次调用函数时,它 returns 生成器对象。每次你调用 next 时,你都会得到第一个项目,即 0 * 0
因为你不是在同一个对象上调用 next(每次都是一个新对象)。但在第二种情况下,你循环遍历一个生成器对象,它会继续消耗生成器,直到它达到 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
你的函数 returns 每次你调用 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 生成器获取新值。