11-装饰器
函数
函数名是函数的名字,本质是:变量,特殊的变量
高阶函数:
函数的接受参数是一个函数名
函数的返回值是一个函数名
满足上述任意以个条件都是高阶函数
函数名(): 执行此函数。
单独打印函数名就是内存地址。
函数名可以作为容器类数据的元素
函数名可以作为参数
函数名可以作函数的返回值
1 #定义一个新的函数 2 def test(): 3 print("hello") 4 5 test() 6 函数是由 7 def和函数名(): 8 函数体 9 组成,函数通过函数名来进行调用,:的作用是为了将函数名和函数体区分开来。 10 11 #函数的传参 12 13 def func(*args): 14 print(*args) #(1,2,30,1,2,33.。。。。。) 15 l1 = [1,2,30] 16 l2= [1,2,33,21,45,66] 17 func(*l1,*l2) 18 19 20 #函数的嵌套 21 def test1(): 22 print(8) 23 def test2(): 24 def test3(): 25 print(6) 26 return True 27 print(7) 28 test3() 29 test2() 30 print(1) 31 test1()
1 def compare(a,b): 2 if a > b: 3 return a 4 elif a == b: 5 return ("一样大") 6 else: 7 return b 8 9 # return a if a > b else b 10 # 三元运算 11 s = compare(6,6) 12 print(s) 13 #当函数之执行时遇到return时就直接返回值,不在执行return之后的语句
1 def test3(z,b):
2 print(z)
3 print(b)
4 return 1,2,3.4,4,5
5 当返回值为多个值的时候,这些元素会组合成一个元组
闭包
就是内层函数对外层函数(非全局)变量的引用
如何判断是否闭包:
内层函数的名字.__closure__如果打印出cell则证明有闭包过程
闭包用处:
当函数开始执行时,如果当函数遇到闭包,他有一个机制,他会永远开辟一个内存空间,将闭包中的内存空间等值放入其中,不会随着函数的执行完毕而消失
节省内存空间
1 def wrapper(func): 2 def inner(*args,**kwargs): 3 4 print(func) 5 print(inner.__closure__) 6 return inner 7 8 wrapper(6)() 9 10 11 >>>6 12 >>>(<cell at 0x00000224785A6C78: int object at 0x000000005B8B53C0>, <cell at 0x00000224785A6CA8: function object at 0x000002247863E9D8>)
装饰器:
本质就是函数,功能是为其他函数添加附属功能
装饰器 = 高阶函数 + 函数的嵌套 + 闭包器
原则:
不能修改被装饰函数的源代码
不修改被装饰函数的调用方式
1 import time 2 3 #装饰器 4 def timmer(f): 5 def ninner(): 6 start_time = time.time() 7 time.sleep(3) 8 f() 9 end_time = time.time() 10 print("%s" %(end_time - start_time)) 11 return ninner 12 13 14 #被装饰函数 15 @timmer # test1 = timmer(test1) 16 def func22(): 17 18 print("hello world") 19 20 21 func22()