Python3-生成器与yield

#斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、…
import time
# def fib(times):
#     a = 0
#     b = 1
#     n = 1
#     while n<=times:
#         print(b)
#         a,b = b,a+b
#         n+=1
# fib(7)

#生成器写法
def fib(times):
    a = 0
    b = 1
    n = 1
    while n<=times:
        # print(b)
        yield b #保存信息状态
        time.sleep(1)
        a,b = b,a+b
        n+=1
    return 'done'  #没什么作用,但是当抛出StopIteration异常的时候会返回return内容
F=fib(7)#生成器,调用一次返回一个值;而不是像普通函数那样去调用def fib()函数
# for i in F:
#     print(i)

'''
yield的作用就把一个函数变成一个生成器,带有yield的函数不再是一个普通
函数,python解释器会将其视为一个generator,调用fib(7)不会执行fib函数
而是返回一个迭代器对象!在for循环执行时,每次循环都会执行fib函数内部的代码,
执行到yield b时,fib函数就返回一个值。下次再调用的时候,其它代码接着由中断
位置接着执行
'''
# 获取生成器函数返回值,用捕获StopIteration异常,for。。in。。永远不会出现异常,所以用while True
while True:
    try:
        print(next(F))
    except StopIteration as e:
        print(e.value)
        break
#所以需要返回值的时候可以如此操作

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

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

生成器的特点:
1、节约内存。
2、保存(上一次)状态。
'''



/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/apple/PycharmProjects/stage4/coroutine/generator_fib.py
1
1
2
3
5
8
13
done


Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值