Python中生成器的使用

Python中生成器的使用,python,generator,Python,Generator,我正在学习生成器,因此我定义了以下计算斐波那契序列的函数: def fib(max): a, b = 0, 1 while a < max: yield a a, b = b, a + b 但是,像这样使用它可以如期工作: f = fib(10) next(f) Out[417]: 0 next(f) Out[418]: 1 next(f) Out[419]: 1 next(f) Out[420]: 2 为什么第一个案例不起作用?

我正在学习生成器,因此我定义了以下计算斐波那契序列的函数:

def fib(max):
    a, b = 0, 1
    while a < max:
        yield a
        a, b = b, a + b
但是,像这样使用它可以如期工作:

f = fib(10)

next(f)
Out[417]: 0

next(f)
Out[418]: 1

next(f)
Out[419]: 1

next(f)
Out[420]: 2
为什么第一个案例不起作用?

next(迭代器[,默认值])

通过调用迭代器的next()方法从迭代器中检索下一项。如果给定默认值,则在迭代器耗尽时返回,否则将引发StopIteration

第一个有效:

它只是为调用
fib(10)

因此,每次调用
fib(10)
时,都会创建一个新的fib函数实例,该实例返回一个特定于该实例的
迭代器


请注意,它们都正确返回第一个值。

在第一种情况下运行它时,它会从头开始,因此它总是先开始-->而在第二种情况下,每次调用f时,f都会发生变化,所以它会先开始-->第二-->第三次。

哦,所以调用fib(10)多次调用与多次调用f不同?每次调用
fib(10)
都是在调用一个全新的函数,但当调用
f
时,就是在调用
fib(10)
的一个实例,这就解释了这一点。@MichaelSB我很高兴这是有意义的!
f = fib(10)

next(f)
Out[417]: 0

next(f)
Out[418]: 1

next(f)
Out[419]: 1

next(f)
Out[420]: 2