Python中的生成器用法

时间:2016-02-15 04:50:57

标签: python generator

我正在学习生成器,所以我定义了以下计算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

为什么第一种情况不起作用?

2 个答案:

答案 0 :(得分:2)

next(iterator[, default])

  

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

第一个有效:

只需为您拨打iterator

时生成的每个函数实例生成一个新的fib(10)

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

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

答案 1 :(得分:0)

当你在第一种情况下运行时,它会从头开始,所以它总是只是开始 - &gt;首先,在第二种情况下,每当你调用f时,f正在改变,所以它开始 - &gt;第一 - &gt;第二 - &gt;第三