装饰器:
定义:本质上还是函数(功能:装饰其他的函数)也就是说:为其他函数添加附加功能
原则:1、不能修改被装饰函数的源代码
2、不能修改被装饰函数的调用方式
总结:也就是说被修改的函数感知不到装饰器的存在,因为没有动函数的运行
实现装饰器知识储备:
1、函数即“变量”
2、高阶函数
3、嵌套函数
高阶函数 + 嵌套函数==》装饰器
1、函数即变量
通过del只是删除掉了门牌号,因为每过一段时就会刷新一次,看那些变量没有被利用就会回收内存。比如;x=1一直被利用就永远不会被清空,除非用del来进行清理变量名,当一段时间刷新时,发现没有门牌号 1没有被引用才会清理掉
Python是通过查找变量名字,如果找不到之后,才会将其中的1删掉 这就是python中的内存回收机制(门牌号没有的情况下会清除掉内容)
其中的lambda x:x*3是可以直接被回收的,可以通过calc = lambda x:x*3 定义一个门牌号
2、高阶函数
a:把一个函数当做实参传递给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
b: 返回值中包含函数名(不修改函数的调用方式)
1 装饰器: 2 3 定义:本质上还是函数(功能:装饰其他的函数)也就是说:为其他函数添加附加功能 4 5 原则:1、不能修改被装饰函数的源代码 6 7 2、不能修改被装饰函数的调用方式 8 9 总结:也就是说被修改的函数感知不到装饰器的存在,因为没有动函数的运行 10 11 实现装饰器知识储备: 12 13 1、函数即“变量” 14 15 2、高阶函数 16 17 3、嵌套函数 18 19 高阶函数 + 嵌套函数==》装饰器 20 21 1、函数即变量 22 23 24 25 26 通过del只是删除掉了门牌号,因为每过一段时就会刷新一次,看那些变量没有被利用就会回收内存。比如;x=1一直被利用就永远不会被清空,除非用del来进行清理变量名,当一段时间刷新时,发现没有门牌号 1没有被引用才会清理掉 27 28 29 Python是通过查找变量名字,如果找不到之后,才会将其中的1删掉 这就是python中的内存回收机制(门牌号没有的情况下会清除掉内容) 30 31 32 其中的lambda x:x*3是可以直接被回收的,可以通过calc = lambda x:x*3 定义一个门牌号 33 34 35 2、高阶函数 36 37 38 a:把一个函数当做实参传递给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能) 39 40 41 b: 返回值中包含函数名(不修改函数的调用方式) 42 43 44 # 匿名函数 45 # calc = lambda x:x*3 46 # print(calc) #输出为 <function <lambda> at 0x0127C660> 内存地址 47 # #函数即变量 48 # 方法1: 49 # def bar(): 50 # print(‘in the bar‘) 51 # def foo(): 52 # print(‘in the foo‘) 53 # bar() 54 # foo() 55 # 方法2: 56 # def foo(): 57 # print(‘in the foo‘) 58 # bar() 59 # def bar(): 60 # print(‘in the bar‘) 61 # foo() 62 #高阶函数 63 # def bar(): 64 # print("in the bar") 65 # def test1(func): 66 # print(func) 67 # func() 68 # func =bar #函数即变量 将函数bar当做一个变量赋给函数func 69 # test1(bar) 70 71 # import time 72 # def bar ():#被修饰的函数 73 # time.sleep(3) 74 # print("in the bar") 75 # def foo(func):# 76 # first_time =time.time() 77 # func()#运行被修饰的函数 78 # stop_time=time.time() 79 # print("run the func is %s" %(stop_time-first_time)) 80 # foo(bar) 81 82 83 import time 84 def bar(): 85 time.sleep(3) 86 print(‘in the bar‘) 87 def foo(func): 88 first_time = time.time() 89 func()#运行被修饰的函数 90 stop_time=time.time() 91 print("run the func is %s" %(stop_time-first_time)) 92 return func 93 print(foo) 94 bar =foo(bar)#python 解释器中有专门的符号来处理 “=” 并且功能相同 95 bar()#相当于不修改函数的调用方式 96 #foo(bar) 97 98 # import time 99 # def bar(): 100 # time.sleep(3) 101 # print(‘in the bar‘) 102 # def test2(func): 103 # print(func) 104 # return func 105 # bar =test2(bar) 106 # bar() 107 108 109 110 111 112 113 114
3、嵌套函数
1 在函数内部以def进行开始的函数 2 Eg: def test1(): 3 print(‘in the test1‘) 4 def bar(): #函数的嵌套 5 print(‘in the bar‘) 6 bar()#函数的调用 7 test1()
局部作用域和全局作用域的访问顺序
1 x =0 2 def A(): 3 x =1 4 def B(): 5 x =2 6 def C(): 7 x =3 8 print(x) 9 C() 10 B() 11 A()