码迷,mamicode.com
首页 > 其他好文 > 详细

yield from巴啦啦

时间:2020-05-01 12:54:07      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:复制   code   进入   inspect   ota   import   结束   from   rom   

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 结束代码

yield from巴啦啦

标签:复制   code   进入   inspect   ota   import   结束   from   rom   

原文地址:https://www.cnblogs.com/liuer-mihou/p/12812929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!