# 因为yield是生成一个生成器并且自动管理上下文,所以gen()函数内的count total average每次调用时
# 都会保留上次的值, 直到程序结束或者return
def gen():
count = 0
total = 0
average = 0
while 1:
new_sum = yield average
count += 1
total += new_sum
average = total / count
def pro_gen():
yield from gen()
def main():
average = pro_gen()
next(average)
res = average.send(10)
print(res)
res = average.send(40)
print(res)
res = average.send(100)
print(res)
main()
# 以下是输出
# 10.0
# 25.0
# 50.0
当 yield from
后面加上一个生成器后,就实现了生成的嵌套。
当然实现生成器的嵌套,并不是一定必须要使用yield from
,而是使用yield from
可以让我们避免让我们自己处理各种料想不到的异常,而让我们专注于业务代码的实现。
如果自己用yield
去实现,那只会加大代码的编写难度,降低开发效率,降低代码的可读性。既然Python已经想得这么周到,我们当然要好好利用起来。
讲解它之前,首先要知道这个几个概念
1、
调用方
:调用委派生成器的客户端(调用方)代码 2、委托生成器
:包含yield from表达式的生成器函数 3、子生成器
:yield from后面加的生成器函数
def gen():
count = 0
total = 0
average = 0
while 1:
new_sum = yield average
if not new_sum:
break
count += 1
total += new_sum
average = total / count
return count, total, average
def pro_gen():
# 只有子生成器要结束(return)了,yield from左边的变量才会被赋值,后面的代码才会执行。
while 1:
count, total, average = yield from gen()
print("计算完毕!!\n总共传入 {} 个数值, 总和:{},平均数:{}".format(count, total, average))
def main():
average = pro_gen()
next(average)
res = average.send(10)
print(res)
res = average.send(40)
print(res)
average.send(None) # 结束协程
res = average.send(10) # 由于上一协程已经结束,将重开一协程
print(res)
average.send('')
main()
"""
10.0
25.0
计算完毕!!
总共传入 2 个数值, 总和:50,平均数:25.0
10.0
计算完毕!!
总共传入 1 个数值, 总和:10,平均数:10.0
"""