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