zoukankan      html  css  js  c++  java
  • day14_生成器进阶

    1.send使用:

    def generator():
        print("123")
        num = yield 1
        print("---"+num)
        print("456")
        yield 2
        print("987")
    g = generator()
    print(g.__next__())  #next遇到yield停止,后send赋值于num
    print(g.send("hello"))

    结果:

    123
    1
    ---hello
    456
    2

    send 获取下一个值的效果和next基本一致

    只是在获取下一个值的时候,给上一yield的位置传递一个数据
    使用send的注意事项
       第一次使用生成器的时候 是用next获取下一个值
      最后一个yield不能接受外部的值

    #计算移动平均值
        
    def averager():
        total = 0.0
        count = 0
        average = None
        while True:
            term = yield average
            total += term
            count += 1
            average = total/count
    
    
    g_avg = averager()
    next(g_avg) #
    print(g_avg.send(10))
    print(g_avg.send(30))
    print(g_avg.send(5))
    
       #              averager    total   count   term
       # next()       None        0       1       None
       # send(10)     10          10      2       10
       # send(30)     30          40      3       20
       # send(5)      5           45      4       5
    ---------------------------------------------------------
    def init(func):  #在调用被装饰生成器函数的时候首先用next激活生成器
        def inner(*args,**kwargs):
            g = func(*args,**kwargs)
            next(g)
            return g
        return inner
    
    @init
    def averager():
        total = 0.0
        count = 0
        average = None
        while True:
            term = yield average
            total += term
            count += 1
            average = total/count
    
    
    g_avg = averager()
    # next(g_avg)   在装饰器中执行了next方法
    print(g_avg.send(10))
    print(g_avg.send(30))
    print(g_avg.send(5))
     
  • 相关阅读:
    开始学习C#
    关于串口数据读取的几个问题
    Joel测试
    VC查找内存泄漏技巧【转】
    思考题一
    自我介绍
    2020面向对象程序设计寒假作业1 题解
    思考题二
    题解 洛谷P2158 【[SDOI2008]仪仗队】
    深入浅出InfoPath系列
  • 原文地址:https://www.cnblogs.com/wzc27229/p/11009089.html
Copyright © 2011-2022 走看看