2.生成器计算出斐波那契数列

#斐波那契数列:1,1,2,3,5,8,13...
def fib(times):
    a = 0
    b = 1
    n = 1
    while n <= times:
        # print(b)
        #返回加到F生成器中,每次都叠加
        yield b
        a,b = b,a+b
        n += 1
    return 'done'
F = fib(10)

# 获取生成器函数返回值,用捕获StopIteration异常
while True:
    try:
        print(next(F))
    except StopIteration as e:
        print(e.value)
        break

'''
总结:
生成器它能返回记住上一次返回时函数体中的位置,对生成器函数的第二次(或第n次),
调用跳转至函数中间yield处,而上次调用的所有的局部变量都保持不变

生成器不仅"记住"数据状态,还记住了它在流程控制构造中的位置

生成器的特点:
1.节约内存
2.保存(上一次的)状态
'''
# print(next(F))
# print(next(F))
# print(next(F))
# print(next(F))#在异常后面显示返回值

# F = fib(7) #F是一个生成器
# print(F)
# for i in F:
#     print(i)
'''
yield的作用就把一个函数变成一个生成器,带有yield函数不再是一个普通函数
python解释器会将其视为一个生成器generator,调用fib(7)不会执行fib函数
而是返回一个迭代器对象,在for循环执行时,每次循环都会执行fib函数内部的代码

执行到yield b时,fib函数就返回一个值.下次再调用的时候,其实代码接着由中断代码
接着执行
'''
原文地址:https://www.cnblogs.com/zhangboblogs/p/8634556.html