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巴啦啦的主要内容,如果未能解决你的问题,请参考以下文章