Python之生成器

一、定义:只要含有yield关键字的函数都是生成器函数,yield不能和return共用且需要写在函数内

二、特点:生成器函数执行之后会得到一个生成器作为返回值,yield不会结束程序

三、创建生成器的两种方式:

  1、生成器推导式   

    generator = (x*2 for x in range(10))    #这里的generator就是一个生成器

    注意:和列表推导式的区别

    1、和列表推导式的区别是括号不一样,列表推导式使用的是中括号 s=[x for x in range(10)]

    2、返回的值不一样,列表推导式返回一个列表,生成器推导式返回一个生成器

    3、比列表推导式节省内存空间

  2、生成器函数

    def generator()

      yield

    generator()   这里的generator()就是一个生成器

四、生成器函数

  含有yield关键字, 可以看成是函数中的return

  send方法  生成器send方法,可以传值给yield,最终将传进的值进行返回

  注意:注意:生成器没有next方法的时候,第一次传值只能为send(None)

  生成器函数的特点:

    调用之后函数内的代码不执行,返回生成器

    每从生成器中取一个值就会执行一段代码,遇见yield就停止

    如何从生成器中取值:

      for :如果没有break就会一直取直到取完

      next: 每次只取一个值

      send不能用在第一个,取下一个值得时候给上个位置传一个新的值,可以使用预激活的方式,next可以放在装饰器中  参照第二个实例

      数据类型强制转换:会一次性把所有的数据都读到内存中

 

五、实例: 

def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count

avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)
计算移动平均值
def init(func):
    def inner(*args,**kwargs):
        g = func(*args,**kwargs)
        next(g)
        return g
    return inner

@init
def aver():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count

aver_g = aver()
ave = aver_g.send(10)
print(ave)
ave = aver_g.send(50)
print(ave)
结合装饰器之后的计算移动平均值__协程

 

 

posted @ 2018-12-11 11:13  hubangsheng  阅读(194)  评论(0编辑  收藏  举报