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

    send()的获取下一个值的效果和__next__一致,

    特别:在获取下一个值的时候,给上一个值的位置传递一个数据

    def generator():
        print(123)
        content = yield 1 # 返回1,赋值来不及,send传了一个值给content
        print('===',content)
        print(456)
        yield 2
    
    g = generator() # 知道是生成器,啥也不执行
    ret = g.__next__() # 开始执行,print(123)执行,yield 1返回给ret
    print('***',ret) #打印1
    ret = g.send('hello') # 继续执行生成器,在执行之前,yield 1变成了hello,注意继续执行到yield 2,2给了ret
    print('***',ret)

     注意:

    第一次使用生成器的时候,用next获取下一个值(因为没有yield)

    最后一个yield不能接受外部的值(错误:ret = yield 2)

    获取移动平均值(如淘宝评价):

    def average():
        sum1 = 0
        count = 0
        avg = 0
        num = yield
        sum1 += num
        count += 1
        yield sum1/count
    avg_g = average()
    avg_g.__next__()
    avg_g.send(10)
    # 优化算法
    def average():
        sum1 = 0
        count = 0
        avg = 0
        while 1:
            num = yield avg
            sum1 += num
            count += 1
            avg = sum1/count
    
    avg_g = average()
    avg_g.__next__()
    avg_g.send(10)
    avg_g.send(20)
    avg_g.send(30)

     预先激活生成器的装饰器:

    def init(f):
        def inner(*args,**kwargs):
            g = f(*args,**kwargs)
            g.__next__()
            return g
        return inner
    @init
    def average():
        sum1 = 0
        count = 0
        avg = 0
        while 1:
            num = yield avg
            sum1 += num
            count += 1
            avg = sum1/count
    
    avg_g = average()
    ret = avg_g.send(10)
    print(ret)
    avg_g.send(20)
    avg_g.send(30)
  • 相关阅读:
    Java中的变量
    Java是什么
    leetcode 75. 颜色分类
    leetcode 283. 移动零
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 53
    剑指 Offer 58
    剑指 Offer 58
    剑指 Offer 57
    剑指 Offer 57. 和为s的两个数字
  • 原文地址:https://www.cnblogs.com/shuoran/p/11650285.html
Copyright © 2011-2022 走看看