zoukankan      html  css  js  c++  java
  • yield from巴啦啦

    def averager():
        print('测试子生成器')
        total = 0.0
        count = 0
        average = None
        while True:
            term = yield average
            if term is None:
                break
            total += term
            count += 1
            average = total / count
        return (count, average)
    
    
    from inspect import getgeneratorstate
    
    
    # 委派生成器
    def grouper1(r):
        while 1:
            ave = averager()
            r[1] = yield from ave  # 可以把yield from 理解成for 循环这个生成器,既不停的next
    
    
    r = {}
    g = grouper1(r)
    next(g)
    g.send(1)
    g.send(None)#1.终止子生成器,进行接下来的操作(下一个while循环之前);2.继续while循环,重新生成一个子生成器实例
    print(getgeneratorstate(g))
    print(r)
    g.send(3)
    g.send(None)
    print(r)
    
    
    # 1.next(g) 激活委派生成器,进入while 循环,代码执行到yield from 子生成器表达式,因为yiled from 具有for的功能,所以激活子生成器
    # 执行子生成器代码,执行到遇到第一个yield终止,回到next(g)调用方
    # 2.g.seng(1) 委派生成器直接把val扔给子生成器的term,代码开始执行,计算出average,执行下一次while循环,直到遇到yield 终止代码
    # 3.g.send(None) 委派生成器直接把val None 发送给term,继续执行is None break,子生成器执行结束 return 将return的值作为StopIteration的value属性;
    # yield from 可以捕获value,  执行{}的赋值
    # ***重点***复制之后,继续执行委派生成器的while循环,重新遇到yiled from 子生成器,继续执行子生成器的代码,知道遇到yield 结束代码
    
    
  • 相关阅读:
    RMQ
    LCA 笔记
    LUCAS 定理
    topcoder 643 DIV2
    BZOJ 1071组队
    Codeforces Round #283 (Div. 2)
    topcoder 642
    Codeforces Round #278 (Div. 2)
    树链剖分
    Codeforces Round #277 (Div. 2)
  • 原文地址:https://www.cnblogs.com/liuer-mihou/p/12812929.html
Copyright © 2011-2022 走看看