讲解装装首先要讲一下高阶函数与闭包,因为装饰器的原理就是闭包
高阶函数
函数名当作普通变量传入或传出函数,具体如下:
只需满足以下任意一个条件,即是高阶函数
- 接受一个或多个函数作为输入
- return 返回另外一个函数
注解:
- 这个好理解,和数学里的高阶函数概念类似,形如f(g(x)),函数自变量不再是x,而是函数g(x)。
- Python的高阶函数,自变量本来是传入或者传出的普通变量,变成了函数。 ```python def mySum(f,x,y): return f(x) + f(y)
res = mySum(abs,2,-3) # abs 内置函数:取绝对值,这里的abs函数也可以是自定义函数 print(res) # 5
<a name="DRL5X"></a>
## 闭包
定义:<br />1.外层函数返回内层函数<br />2.外层函数的变量被内层函数使用(这个被引用的变量将和这个内层函数一同存在)<br />注解:从定义可以看出,闭包就是高阶函数,不同的只是:`外层函数的变量被内层函数使用`
<a name="PBG5G"></a>
### 闭包的一般使用
```python
def line_conf(a, b):
def line(x):
return a*x + b
return line
line1 = line_conf(1, 1)
print( line1(5) ) # 6
# 第7行执行完后,回收函数的内存空间,但是闭包line1会保留自由变量a b
代码执行流程: line1 -> line7 -> line1 -> line2 -> line1 -> line5 -> line7 -> line8 -> line3 -> line8
闭包的使用注意
由于闭包会保留使用的外层函数的变量,因此如果内层函数使用的外层数的变量如果是可变类型,该变量的数据会被保留
外层函数的:局部、形参、实参均可被内层函数保留
def outer(name):
count=[0] # 变量在函数中
def inner():
count[0]+=1
print( 'Hello,', name,', ', str(count[0])+' access!')
print( count)
return inner
hello = outer('ecithy')
hello()
hello()
hello()
def outer(name, count=[0]): # 变量在形参中
def inner():
count[0]+=1
print( 'Hello,', name,', ', str(count[0])+' access!')
print( count)
return inner
hello = outer('ecithy')
hello()
hello()
hello()
def outer(name, count):
def inner():
count[0]+=1
print( 'Hello,', name,', ', str(count[0])+' access!')
print( count)
return inner
hello = outer('ecithy', [0]) # 变量在实参中
hello()
hello()
hello()
输出:
Hello, ecithy , 1 access!
[1]
Hello, ecithy , 2 access!
[2]
Hello, ecithy , 3 access!
[3]