Python 为什么我需要先将生成器函数存储到变量?
我正在探索python中生成器的使用,但遇到了一个奇怪的问题 以下代码如何能按预期工作(例如,每次调用函数时返回下一个斐波那契数): 但是当我直接调用for循环中的函数时,如下所示:Python 为什么我需要先将生成器函数存储到变量?,python,generator,yield,Python,Generator,Yield,我正在探索python中生成器的使用,但遇到了一个奇怪的问题 以下代码如何能按预期工作(例如,每次调用函数时返回下一个斐波那契数): 但是当我直接调用for循环中的函数时,如下所示: for i in range(0,21): print(next(fibonacci())) 它打印出21个零?正如克里斯在评论中所说: 因为在每次迭代中,您都在创建新的生成器对象,一遍又一遍地获取第一个元素 通过直接迭代,可以避免将其分配给变量。这样,您可以只创建一个生成器对象: for n, i in
for i in range(0,21):
print(next(fibonacci()))
它打印出21个零?正如克里斯在评论中所说:
因为在每次迭代中,您都在创建新的生成器对象,一遍又一遍地获取第一个元素 通过直接迭代,可以避免将其分配给变量。这样,您可以只创建一个生成器对象:
for n, i in zip(fibonacci(), range(0,21)):
print(n)
因为在每次迭代中,您都在创建新的
generator
对象,一次又一次地获取第一个元素。谢谢,我明白了。我不知道fibonacci()的第一个调用是初始化generator对象。我想知道为什么这个问题得到了这么多否定的回答,因为这对我来说并不明显。更好的解决方案是将范围参数添加到fibonacci
本身,并使用enumerate
@True。函数应该从技术上控制迭代次数,以避免此类伤亡。
for n, i in zip(fibonacci(), range(0,21)):
print(n)