题目👇
(1)编写程序,实现一个计算输入数值的平均数的计算器。该计算器可以根据需要接受输入的值,并计算当前所有输入值的平均值。然后还可以继续接受输入值,继续计算平均值。直到外部主动结束不再输入数值。(使用yield from实现)
(2)编写一个装饰器函数,可以实现为函数增加计算函数执行时间的功能。支持带输入参数和返回值的函数。
解题思路👇
(1)计算器内部需要存储之前输入的数的总和s以及数字个数l,在每一次输入新的数字后更新s和l,然后再返回新的平均数,我们使用yield来完成这一步,i是传进来的数字列表,yield返回的是s/l也就是平均数,定义好了内部生成器,在外部生成器使用yield from来调用内部,让代码调用更直观清晰。
其中yield from的用法可以参考这篇博客:Python中yield和yield from的用法 - cnkai - 博客园
(2)首先要加载time模块,在timer装饰器中定义inner,因为要支持有参数的函数所以形参是*args和**kwargs这样的可变参数,用start和end记下函数开始和结束的时间,最后打印出函数消耗的时间。除此之外别忘了函数有返回值,在这里我们要先把返回值给到inner,再由装饰器传回函数调用处。
参考代码👇
#coding:utf-8
#author:Mitchell
#part1:编写程序,实现一个计算输入数值的平均数的计算器。
#该计算器可以根据需要接受输入的值,并计算当前所有输入值的平均值。
#然后还可以继续接受输入值,继续计算平均值。
#直到外部主动结束不再输入数值。(使用yield from实现)
#内部生成器
def counter_1():
i = []
s,l=0,0
i=yield []
while len(i)!=0:
s+=sum(i)
l+=len(i)
i = yield s/l
#外部生成器
def counter_2():
yield from counter_1()
#实例化
gen=counter_2()
next(gen)
while(True):
numlist=list(input('请进行下一轮输入或者回车结束进程:').split(' '))
#判断结束条件
if numlist==['']:
break
#类型转换
for i in range(len(numlist)):
numlist[i]=int(numlist[i])
print(gen.send(numlist))
#part2:编写一个装饰器函数,可以实现为函数增加计算函数执行时间的功能。
#支持带输入参数和返回值的函数。
import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
result = func(*args,**kwargs)
end=time.time()
print('The used time=',end-start)
return result
return inner
@timer #这句话等同于func2 = timer(func2),意为这个函数使用timer装饰器
def func1(a,b):
print('in func1')
print(a,' is ',b)
return 'func1 is over!'
print(func1('python','nb'))