我正在学习生成器,所以我定义了以下计算Fibonacci序列的函数:
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a + b
我试图像这样使用它,但它没有工作:
next(fib(10))
Out[413]: 0
next(fib(10))
Out[414]: 0
next(fib(10))
Out[415]: 0
然而,像这样使用它按预期工作:
f = fib(10)
next(f)
Out[417]: 0
next(f)
Out[418]: 1
next(f)
Out[419]: 1
next(f)
Out[420]: 2
为什么第一种情况不起作用?
答案 0 :(得分:2)
next(iterator[, default])
通过调用next()方法从迭代器中检索下一个项目。如果给定default,则在迭代器耗尽时返回,否则引发StopIteration。
第一个有效:
只需为您拨打iterator
fib(10)
因此,每次调用fib(10)
时,都会创建一个新的fib函数实例,该实例返回特定于该实例的iterator
。
请注意,它们都正确返回第一个值。
答案 1 :(得分:0)
当你在第一种情况下运行时,它会从头开始,所以它总是只是开始 - &gt;首先,在第二种情况下,每当你调用f时,f正在改变,所以它开始 - &gt;第一 - &gt;第二 - &gt;第三