06-生成器案例:斐波那契数列

目标

  • 知道通过 yield 关键字可以创建生成器

1. 斐波那契数列

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现。

我们仍然用上一节提到的斐波那契数列来举例,回想我们在上一节用迭代器的实现方式:

def fibonacci(n):
    # 定义斐波那契数列的前2个值
    a = 1
    b = 1

    # 定义当前的位置
    current_index = 0
    print("------------1111-----------")

    while current_index < n:
        # 定义要返回的值
        result = a
        # 生成新的 a、b值
        a, b = b, a+b
        # 让当前值+1
        current_index += 1
        print("-----------2222----------")
        yield result

        print("-----------3333------------")


# 生成器,生成斐波那契数列
fib = fibonacci(5)

value = next(fib)
print(value)

value = next(fib)
print(value)
运行结果:

------------1111-----------
-----------2222----------
1
-----------3333------------
-----------2222----------
1

Process finished with exit code 0

2. yield关键字

  • 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)

  • yield关键字有两点作用:

保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起

将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用