-定义:本质是函数,功能是为其他函数添加附加功能
-原则:
1,不修改被修饰函数的源代码
2,不修改被修饰函数的调用方式
装饰器=高阶函数 +函数嵌套 +闭包
高阶函数的定义:
-函数接收的参数是函数名
import time
def foo():
time.sleep(0.1)
print(‘你们好啊‘)
def test(func):
start_time = time.time()
func()
end_time = time.time()
print(‘运行时间是:%s‘%(end_time-start_time))
test(foo)=======================》此函数接收大参数是函数名,但函数foo()的运行方式改变成了test(foo)
结果是:你们好啊
运行时间是:0.10401010513305664
-函数的返回值也是函数名
import time
def foo():
time.sleep(0.1)
print(‘你们好啊‘)
def test(func):
start_time = time.time()
func()
end_time = time.time()
print(‘运行时间是:%s‘%(end_time-start_time))
return func
foo = test(foo)======>结果是 你们好啊
运行时间是:0.10253691673278809
foo()============>结果是:你们好啊
满足上述任意一个条件都是高阶函数
-函数嵌套
在函数中重新定义一个函数,如下:
def foo():
print(‘你好‘)
def test():
print(‘alisa‘)
test()
ps:函数也是一个变量
- 闭包类似于作用域
装饰器框架(如下):
def timmer(func):
def wrapper():
print(func)
func()
return wrapper
需要计算以下函数运行的时间,写代码(用装饰器):
import time
def timmer(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(‘程序运行时间是%s‘%(end_time-start_time))
return wrapper
def test():
time.sleep(0.3)
print(‘到此结束‘)
test = timmer(test)======》此处timmer(test)运行的结果是返回wrapper的地址
test()=======》此处相当于运行wrapper()
注意:上述倒数第二行代码中test = timmer(test)可以换成@timmer 进行简化
可以直接在需要装饰的函数前写上 @装饰器 直接对函数进行装饰
-需要装饰的函数添加返回值:
import time
def timmer(func):
def wrapper():
start_time = time.time()
res = func()
end_time = time.time()
print(‘程序运行时间是%s‘%(end_time-start_time))
return res
return wrapper
@timmer
def test():
time.sleep(0.3)
print(‘到此结束‘)
return ‘ni‘
res =test()
print(res)
运行结果是:
到此结束
程序运行时间是0.3040931224822998
ni
- 需要装饰的函数加上多个参数
import time
def timmer(func):
def wrapper(*args,**kwargs): ======>注意:*args:上传的是以()元祖的形式,例如:(1,2,3,4)**kargs 上传的是字典的形式 如:(name = alisa)
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print(‘程序运行时间是%s‘%(end_time-start_time))
return res
return wrapper
@timmer
def test(age,name):
time.sleep(0.3)
print(‘到此结束‘,‘年龄是【%s】,名字是【%s】‘%(age,name))
return ‘ni‘
test(12,‘lisa‘)
ps: 补充技巧 如下:
ni = [21,23,22,33,44,55,88,55]
求第一位元素
a,*_d =ni=====》a代表第一位元素,d代表最后一位元素 *代表中间元素,_代表不显示
print(a)======>第一位元素是 21
求第一位和最后一位元素
a,*_,d=ni
print(a,d)====》21,55
将a = 1 b = 2 变成 a = 2,b = 1
a,b=2,1
print(a,b)====结果是2,1
原文:https://www.cnblogs.com/wode110/p/14697587.html