栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python】使用生成器(yield from)和装饰器封装函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python】使用生成器(yield from)和装饰器封装函数

题目

(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'))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/360444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号