ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python学习笔记(4)装饰器

2021-05-22 15:32:19  阅读:175  来源: 互联网

标签:函数 python sum1 summ 笔记 time print 装饰 def


# 
# 所谓装饰器就是在不改变原来函数的调用方式的情况下,给函数添加新功能。
# 例如我们有求和函数如下:
def summ(x = 0, y = 0):
    sum1 = x + y
    time.sleep(0.1)
    return sum1
# 此时我们需要给该函数添加一个新功能,计算函数执行所花费的时间,由于该函数已经被其他模块调用,所以函数名不能改
# 同时,其他函数在调用summ(x, y)时,需要有计算函数执行时间的功能。
# 于是利用高阶函数的思维,将summ(x, y)函数作为一个参数传入另外一个函数,如下:
def timer(summ):
    time1 = time.time()
    summ()
    time2 = time.time()
    print('执行时间为:', time2 - time1)

timer(summ)
'''
执行结果:
执行时间为: 0.10826659202575684
'''
# 这样虽然实现了功能,但是需要修改所有调用改函数的模块,将summ()修改问timer(summ),这样不满足封闭原则
# 所以这里我们需要将在不改变函数的调用方式的情况下,完成新功能的添加,于是调整如下:
def timer(func):
    def inner():
        time1 = time.time()
        func()
        time2 = time.time()
        print('执行时间为:', time2 - time1)
    return inner
print('*'*100)
summ = timer(summ)
summ()
'''
执行结果:
****************************************************************************************************
执行时间为: 0.10765576362609863
'''
# 这样我们既实现了新功能,又能保证调用方式不变,接下来需要解决传参和返回值的问题
# 先看返回值,summ函数是计算两个值的和,需要返回两值的和,所以需要将和返回,如下:
def summ(x = 0, y = 0):
    sum1 = x + y
    time.sleep(0.1)
    return sum1

def timer(func):
    def inner():
        time1 = time.time()
        ret = func()
        time2 = time.time()
        print('执行时间为:', time2 - time1)
        return ret
    return inner
print('*'*100)
summ = timer(summ)
sum1 = summ()
print(sum1)
'''
执行结果为:
****************************************************************************************************
执行时间为: 0.10943269729614258
0----这就是返回值
'''
# 接下来需要解决传参的问题,我们的summ函数需要提供两个参数,但是由于我们这个装饰函数可能装饰不同的函数,不同的函数的参数个数可能不一致
# 所以这里需要写成接收任意参数(*args, **kwargs),如下:
def summ(x = 0, y = 0):
    sum1 = x + y
    time.sleep(0.1)
    return sum1

def timer(func):
    def inner(*args, **kwargs):
        time1 = time.time()
        ret = func(*args, **kwargs)
        time2 = time.time()
        print('执行时间为:', time2 - time1)
        return ret
    return inner
print('*'*100)
summ = timer(summ)
sum1 = summ(2, 5)
print(sum1)
'''
执行结果:
****************************************************************************************************
执行时间为: 0.10875892639160156
7----这就是传参之后求和的结果
'''
# 这样这个装饰器就完成了,在python中有一种简单的方式来表示装饰器,就是用@加上装饰函数,写在被装饰函数的前面,如下:
@timer
def summ(x = 0, y = 0):
    sum1 = x + y
    time.sleep(0.1)
    return sum1
print('*'*100)
sum1 = summ(6, 5)
print(sum1)
'''
执行结果:
****************************************************************************************************
执行时间为: 0.10714888572692871
11
'''
# 这样装饰器就讲完了。

 

标签:函数,python,sum1,summ,笔记,time,print,装饰,def
来源: https://www.cnblogs.com/tortoise512/p/14798994.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有