day04-函数,装饰器初成
面试的时候,经常被问过装饰器,所以掌握好装饰器非常重要。
一.装饰器形成的过程:1.最简单的装饰器。2.被装饰的函数有返回值。3.被装饰的函数有一个参数。4.被装饰的函数有多个位置参数。5.被装饰的函数有多个位置参数和关键字参数。
二.装饰器的作用:不修改被装饰的函数的代码和调用方式,增加新的功能。
三.原则:开放封闭原则。
四.语法糖:@wrapper
五.装饰器的固定模式。 一.装饰器形成的过程:1.最简单的装饰器。注意:下面代码没修改被装饰的函数的代码,但是调用使用了timmer(test)而不是test(),改变了调用方式,会导致
以前调用该函数的程序发生错误(如果以前有人使用过你写的函数)。
使用 时间函数 计算 代码 运行的时间
import time
def timmer(t): #timmer(t)是时间装饰器
start = time.time() #开始:函数开始运行的时间
time.sleep(0.01) #让函数睡眠0.01秒,否则打印的结果是0.0。
t() #过程:函数运算的过程。t()表示调用被装饰的函数。
end = time.time() #结束:函数结束运行的时间
print(end-start) #打印出运算的过程需要多少时间
def test():
print('今天必须非常努力,我要寻找热爱学习热爱工作的自己,我会为自己的努力而感到快乐幸福和满足')
timmer(test) #把需要计算运行时间的函数对象(或者说是地址)传给时间函数timmer 1.在不准修改test函数的情况下,装饰器发挥非常重要的作用:不修改test函数的代码,那么调用test函数的方式也不能修改,但是想在函数前后增加功能。
2.下面例子,test()这种调用函数的方式没有改变,但是给test函数增加了计算运行时间的功能。
3.开放封闭原则:对拓展(增加功能)是开放的,但是对修改被装饰的函数是封闭的。 一.装饰器形成的过程:1.最简单的装饰器:不修改被装饰的函数的代码和调用方式,使用了内部函数和闭包。
import time
def timmer(f): #装饰器函数
def inner():
start = time.time()
time.sleep(0.01)
f() #被装饰的函数
end = time.time()
print(end-start)
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test():
print('今天必须非常努力,我要寻找热爱学习热爱工作的自己,我会为自己的努力而感到快乐和幸福和满足')
test() #test()=inner() #一.装饰器形成的过程:2.被装饰的函数有返回值。
import time
def timmer(f): #装饰器函数
def inner():
start = time.time()
time.sleep(0.01)
n = f() #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(): #被装饰的函数
print('今天必须非常努力,我要寻找热爱学习热爱工作的自己,我会为自己的努力而感到快乐和幸福和满足')
return 10000000
print(test()) #test()=inner() #一.装饰器形成的过程:3.被装饰的函数有一个参数。
import time
def timmer(f): #装饰器函数
def inner(a):
start = time.time()
time.sleep(0.01)
n = f(a) #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(a): #被装饰的函数
print('加油',a)
return 10000000
print(test(10000000)) #test(a)=inner(a) 一.装饰器形成的过程:4.被装饰的函数有多个位置参数。
import time
def timmer(f): #装饰器函数
def inner(*args):
start = time.time()
time.sleep(0.01)
n = f(*args) #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(*args): #被装饰的函数
print('加油',args)
return 10000000
print(test(1,2,3)) #test(*args)=inner(*args) #一.装饰器形成的过程:5.被装饰的函数有多个位置参数和关键字参数。
import time
def timmer(f): #装饰器函数
def inner(*args,**kwargs):
start = time.time()
time.sleep(0.01)
n = f(*args,**kwargs) #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(*args,**kwargs): #被装饰的函数
print('加油',args,kwargs)
return 10000000
print(test(1,2,3,t=8000000,m=10000000)) #test(*args,**kwargs)=inner(*args,**kwargs) 四.语法糖:@wrapper
import time
def timmer(f):
def inner():
start = time.time()
time.sleep(0.01)
n = f()
end = time.time()
print(end - start)
return n
return inner
@timmer #语法糖@timmer相当于 func=timmer(func) 没有语法糖或func=timmer(func),装饰器就无法起作用。
def func():
print('今天继续加油')
func() 五.装饰器的固定模式。wrapper是装饰的意思。
def wrapper(f):
def inner(*args,**kwargs):
'''在被装饰的函数前面增加功能'''
ret = f(*args,**kwargs)
'''在被装饰的函数后面增加功能'''
return ret
return inner #上面五句话是装饰器的固定模式。
@wrapper
def func(*args,**kwargs):
return args,kwargs
print(func(1,2,3,m=10000000)) 六.装饰器的执行过程:
1. def wrapper(f):
4. def inner(*args,**kwargs):
7. '''在被装饰的函数前面增加功能'''
8. ret = f(*args,**kwargs)
9. '''在被装饰的函数后面增加功能'''
10. return ret #返回func(1,2,3,m=10000000)的返回值,因为第6步使用了print,所以被装饰的函数的返回值就被打印出来。
5. return inner #返回inner给wrapper(func),那么inner=wrapper(func)=func
3. @wrapper #func=wrapper(func)传参
2. def func(*args,**kwargs):
return args,kwargs
6. print(func(1,2,3,m=10000000)) #func=inner,相当于print(inner(1,2,3,m=10000000)),接着内部函数inner执行。
调用func函数实际上是调用了装饰器的内部函数:inner函数。
day04-函数,装饰器初成的更多相关文章
- python语法基础-函数-装饰器-长期维护
######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- python二 总结--函数-- 装饰器
装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码 ...
- Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- python语言中的函数装饰器
装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具 在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...
- Python 函数装饰器简明教程
定义类的静态方法时,就使用了装饰器.其实面向对象中的静态方法都是使用了装饰器. @staticmethod def jump(): print(" 3 meters high") ...
- python-Debug、函数装饰器
Debug操作: 程序出问题的时候可以用debug来看一下代码运行轨迹,然后找找问题在哪里 1.先给即将debug的代码打上断点: 2.打完断点之后右键点击debug: 3.然后依次点击开始按钮让 ...
- Python函数装饰器原理与用法详解《摘》
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
随机推荐
- 分布式CAP定理(转)
在弄清楚这个问题之前,我们先了解一下什么是分布式的CAP定理. 根据百度百科的定义,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性). Availability(可 ...
- webservice wsdl文件标签讲解
<?xml version="1.0" encoding="utf8"?> <wsdl:definitions targetNamespace ...
- 题解 P1082 【同余方程】
题目 这里给出非递归的 exgcd 做法 [基础] ( 只需要非递归的同学麻烦跳过 ) 由于欧几里德算法 ( 又名辗转相除法 ) 可以帮助我们求出最大公约数,并且提出对于 \(\forall a,b\ ...
- 批量导入数据表(oracle)
批量导入数据表(oracle) 1.登陆plsql 2.找到菜单栏 工具>>导入数据>>新增图标(会提示选择*.csv文件) 选择如上图所示 3.选择数据并导入 4.下图为执行 ...
- TCP三次握手和四次挥手相关
客户端A 服务端BSYN (建立连接位标识 1为建立联机) ACK (确认位标识 1为确认) seq (一个随机顺序码) ack(一个确认号码,通常为seq+1) 三次握手:1.A 发起建立 连接 的 ...
- ZJNU 2340/2341/2343 - 罗小黑的“礼物”Ⅰ/Ⅱ/Ⅲ
把一位数.两位数.三位数……这些所在的范围分开判断 可得1~9这些数范围在[1,9]内 10~99内共有90个数,每个数占两位,所以共有180位在,范围在[10,189]内 同理,100~999内共有 ...
- image compression with libjpeg
http://www.aaronmr.com/en/2010/03/test/ Working on the project I've seen in the need for compression ...
- Mybatis学习——Mybatis入门程序
MyBatis入门程序 一.查询用户 1.使用客户编号查询用户 (1).创建一个数据表 USE spring; #创建一个名为t_customer的表 CREATE TABLE t_customer( ...
- BBS注册功能
BBS注册功能 一.后端 1.组件校验数据 """ @author RansySun @create 2019-11-03-11:35 """ ...
- _\_call\_\_
__call__ 一.__call__ 对象后面加括号时,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对 ...