【摘要】本篇博文通过生成器实现计算平均值,与传统计算平均值不同的是本篇博文动态实现随着新增元素的数值不断更新平均值。
代码如下:
def averager():
# 所有数的和, 默认为0;
total = 0.0
# 数值的个数;
count = 0
# 平均值结果;
average = None
# 所有数值存储的容器(List);
all_items = []
while True:
# 函数包含yield关键字
new_item = yield average, all_items
all_items.append(int(new_item))
total += new_item
count += 1
average = total / count
def main():
# AVERAGER是个生成器;
AVERAGER = averager()
# 第一次调用next方法, 遇到yield停止,
next(AVERAGER)
# 死循环, 依次求解平均值;
while True:
new_num = input("请输入求平均值的数: ")
if new_num == 'q':
print("程序执行结束.....")
break
# 1). 通过send方法将求平均值的数值传到yield所在位置
# 2). send方法的返回值是求平均值的列表和平均值结果;
average, all_items = AVERAGER.send(int(new_num))
print(all_items, "的平均值为:", average)
main()
执行效果:
代码执行流程:
-
调用main函数,进入main函数体
-
AVERAGER = averager()
得到一个名为AVERAGER的生成器 -
next(AVERAGER)
第一次调用AVERAGER生成器要用next方法, 进入生成器执行代码,直到遇到yield停止 -
进入生成器代码,初始化以下值
#数值总和
total = 0.0
#数值的个数;
count = 0
#平均值结果;
average = None
#存储所有数值的容器(List);
all_items = [ ]
并进入死循环,new_item = yield average, all_items 遇到yield关键字停止执行生成器中的代码。 -
进入main函数体,由于next方法调用前并没有变量,所以不接收任何生成器中的内容,继续执行死循环。
new_num = input("请输入求平均值的数: ")
用new_num变量接收传入的数值,并进行判断 -
如果new_num变量的值不是q,则执行
average, all_items = AVERAGER.send(int(new_num))
通过send方法,将new_num变量中的值传入AVERAGER生成器中,进入生成器执行代码 -
new_item = yield average, all_items
将从send方法获取到的值传递给生成器中的变量new_item,并执行下面的代码,直到遇到下一个yield关键字,停止执行,并将本行yield后面的两个变量average, all_items传递给main函数体中send调用那一行代码的等号左边两个变量average, all_items -
print(all_items, “的平均值为:”, average) 打印结果