装饰器
定义:
装饰器:器为函数意思,本质上是函数,与函数没有多大的区别,同样是def定义的函数。主要用来装饰其他函数,就是给其他函数添加新的功能。
规则:
1.不能修改被装饰函数的源代码
2.不能修改被装饰函数的调用方式
总结:
装饰器对被 装饰的函数完全是透明的。
实现装饰器的知识储备:
1.函数即‘变量’
2.高阶函数
a.把一个函数的函数名当作实参传给宁外一个函数(不改变被装饰函数的源代码为其添加功能)
b.返回值中包含函数名。(不改变原函数的调用方式的情况下为其添加功能)
3.嵌套函数
高阶函数+嵌套函数---》装饰器
函数即‘变量’
定义一个x=1,在内存中是:内存中开辟一个小房子,将1这个值放进去,而x是这个房子的门牌号,指向的是存1的内存地址,这个就是函数的引用。调用变量是,直接x就行。
函数即“变量”,同样的,函数名=函数体,将函数体放入内存中,就是一堆的字符串,并没有什么功能,将函数名这个门牌号指向这个函数体的内存地址。只是函数调用的时候要在函数名后面加小括号---》函数名()
匿名函数,是没有函数名=函数体这样的,如果没有变量接收它,那么它会立刻被内存回收机制回收。
python解释器自带内存回收机制的功能
解释器主要就是看这个值的变量的引用是否为0,为0就回收,不为0,不回收。比如:x=1 y=x 那么存储1这个值的内存地址就有2个引用。
del x 删除了一个门牌号,去掉了一个引用,隔一段时间会自动刷新。
你不人为的去删除门牌号,它是会一直存在,直到函数结束,释放。
python解释器是先解释,后调用,也就是与变量一样,先定义后调用。比如:x=1 y=2 print(x,y)与 y=2 x=1 print(x,y)是一样的效果,都是先在内存中定义,已经存在。
# def foo(): # print("in the foo") # bar()#在内存中找bar指向的内存,没有,报错 # foo() # def bar(): # print("in the bar") # def foo(): # print("in the foo") # bar() # foo() # def foo(): # print("in the foo") # bar() # def bar(): # print("in the bar") # foo() def foo(): print("in the foo") bar() foo()#第一,函数由上向下执行,首先,是在内存中定义foo,然后调用foo,但是这个时候内存中还没有定义bar,所以会出错 def bar(): print("in the bar")
高阶函数
高阶函数
a.把一个函数的函数名当作实参传给宁外一个函数(不改变被装饰函数的源代码为其添加功能)
b.返回值中包含函数名。(不改变原函数的调用方式的情况下为其添加功能)
1 import time 2 def bar(): 3 time.sleep(3) 4 print("in the bar") 5 6 def test(func): 7 start_time=time.time() 8 func() 9 stop_time=time.time() 10 print("the run func time is %s"%(stop_time-start_time)) 11 12 test(bar) 13 print(bar)
import time def bar(): time.sleep(3) print("in the bar") def test(func): print("in the test") return bar print(bar) bar=test(bar) print(bar) bar()
嵌套函数
定义:在一个函数里面用def去定义一个新的函数,就叫嵌套函数;
嵌套函数肯定默认是从里往外找;
def test(): print("in the test") def bar(): print("in the bar") bar() test()
def test2(): pass def test1(): print("in the test1") test2() test1()
这个就是函数的调用而不是嵌套函数
1 x=1 2 def grandpa(): 3 x=1 4 def dad(): 5 x=2 6 def son(): 7 x=3 8 print(x) 9 son() 10 dad() 11 grandpa()
函数永远都是从里面往外找
记住,函数即变量,函数体里面的函数,也只在当前函数内生效,跟局部变量和全局变量的作用域是一样的。假设你函数定义了不调用,就与变量定义了不调用是一样的。