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)
在后一种情况下,我从同一个生成器中获取新值。
每次调用该函数时,它都会返回一个生成器对象。每次您在其上调用下一个时,您都会获得第一个项目,这是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)