讲解装装首先要讲一下高阶函数与闭包,因为装饰器的原理就是闭包

高阶函数

函数名当作普通变量传入或传出函数,具体如下:
只需满足以下任意一个条件,即是高阶函数

  • 接受一个或多个函数作为输入
  • 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

  1. <a name="DRL5X"></a>
  2. ## 闭包
  3. 定义:<br />1.外层函数返回内层函数<br />2.外层函数的变量被内层函数使用(这个被引用的变量将和这个内层函数一同存在)<br />注解:从定义可以看出,闭包就是高阶函数,不同的只是:`外层函数的变量被内层函数使用`
  4. <a name="PBG5G"></a>
  5. ### 闭包的一般使用
  6. ```python
  7. def line_conf(a, b):
  8. def line(x):
  9. return a*x + b
  10. return line
  11. line1 = line_conf(1, 1)
  12. print( line1(5) ) # 6
  13. # 第7行执行完后,回收函数的内存空间,但是闭包line1会保留自由变量a b

代码执行流程: line1 -> line7 -> line1 -> line2 -> line1 -> line5 -> line7 -> line8 -> line3 -> line8

闭包的使用注意

由于闭包会保留使用的外层函数的变量,因此如果内层函数使用的外层数的变量如果是可变类型,该变量的数据会被保留
外层函数的:局部、形参、实参均可被内层函数保留

  1. def outer(name):
  2. count=[0] # 变量在函数中
  3. def inner():
  4. count[0]+=1
  5. print( 'Hello,', name,', ', str(count[0])+' access!')
  6. print( count)
  7. return inner
  8. hello = outer('ecithy')
  9. hello()
  10. hello()
  11. hello()
  1. def outer(name, count=[0]): # 变量在形参中
  2. def inner():
  3. count[0]+=1
  4. print( 'Hello,', name,', ', str(count[0])+' access!')
  5. print( count)
  6. return inner
  7. hello = outer('ecithy')
  8. hello()
  9. hello()
  10. hello()
  1. def outer(name, count):
  2. def inner():
  3. count[0]+=1
  4. print( 'Hello,', name,', ', str(count[0])+' access!')
  5. print( count)
  6. return inner
  7. hello = outer('ecithy', [0]) # 变量在实参中
  8. hello()
  9. hello()
  10. hello()

输出:
Hello, ecithy , 1 access!
[1]
Hello, ecithy , 2 access!
[2]
Hello, ecithy , 3 access!
[3]