Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我需要先将生成器函数存储到变量?_Python_Generator_Yield - Fatal编程技术网

Python 为什么我需要先将生成器函数存储到变量?

Python 为什么我需要先将生成器函数存储到变量?,python,generator,yield,Python,Generator,Yield,我正在探索python中生成器的使用,但遇到了一个奇怪的问题 以下代码如何能按预期工作(例如,每次调用函数时返回下一个斐波那契数): 但是当我直接调用for循环中的函数时,如下所示: for i in range(0,21): print(next(fibonacci())) 它打印出21个零?正如克里斯在评论中所说: 因为在每次迭代中,您都在创建新的生成器对象,一遍又一遍地获取第一个元素 通过直接迭代,可以避免将其分配给变量。这样,您可以只创建一个生成器对象: for n, i in

我正在探索python中生成器的使用,但遇到了一个奇怪的问题

以下代码如何能按预期工作(例如,每次调用函数时返回下一个斐波那契数):

但是当我直接调用for循环中的函数时,如下所示:

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)