yield from巴啦啦

Posted liuer-mihou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 结束代码

以上是关于yield from巴啦啦的主要内容,如果未能解决你的问题,请参考以下文章

程序员的自我修养之精神内耗

yield from语法的高级特性

Python并发编程理解yield from协程

知识点:从迭代器一直到yield from

24 点游戏算法题的 Python 函数式实现: 学用itertools,yield,yield from 巧刷题

yield 与 yield from