将之前学习Python的笔记整理记录下来。
闭包
概念:
一种组织代码的结构,减少了参数传递,提高了代码的可重复使用性
如果在一个内嵌函数里,对在外部函数内的变量进行引用,那么内嵌函数就被认为闭包。
缺点:
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。
前提:
1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数的变量
3.外部函数的返回值必须是内部函数对象
举例:
def func(a, b):
def func_in(x):
return a * x + b
# 返回内部函数
return func_in
if __name__ == '__main__':
ts = func(1, 1)
# 传递参数
print(ts(2))
装饰器
概念:
1.装饰器其实是用闭包来实现的。
2.本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
3.装饰器不能对被装饰的函数内部进行操作 只能在函数执行之前或者后面添加功能。
应用场景:
参数检查(Agrument checking)
缓存(Caching)
代理(Proxy)
提供上下文(Context Provider)
装饰器执行/装饰顺序:
装饰由下到上 执行由上到下
举例:
def add_fun(func3):
# 定义不定长参数 接收
def fun_in(*args, **kwargs):
print("---add----")
# 无论有没有返回值 都接受
ret = func3(*args, **kwargs)
return ret
return fun_in
# 装饰有参数的函数
@add_fun
def func(fun):
print("fun ", fun)
# 装饰有返回值的函数
@add_fun
def func1():
return "func1"
if __name__ == '__main__':
func(123)
ret = func1()
print(ret)
闭包和装饰器区别:
装饰器需要传递被装饰的函数对象给装饰器
闭包则需要传递变量给内嵌函数