我有这个生成器函数:
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
有人能解释一下这种效果的原因和我所缺失的概念吗?
我有这个生成器函数:
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
有人能解释一下这种效果的原因和我所缺失的概念吗?
每次调用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
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
days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
def gen(d):
for i in d:
yield i
obj = gen(days)
print(next(obj, 'Default Value')) # 'Sun'
print(next(obj, 'Default Value')) # 'Mon'
print('--------------------------')
for j in obj:
print(j) # 'Tue' 'Wed' 'Thu' 'Fri' 'Sat'
print(next(obj, 'Default Value')) # Default Value
在上面,我们已经调用了next()两次,因此我们知道生成器函数保存程序执行状态,因此在for循环中它返回来自下一个生成器对象的对象。
但是如果首先使用for循环
,则在for循环期间,我们将接收或调用所有生成的对象,因此我们不会剩下任何生成器对象,因此我们将获得next()
函数调用的默认值。
输出:
Sun
Mon
-------------------------
Tue
Wed
Thu
Fri
Sat
Default Value