闭包
在函数中提出的概念
闭包的条件:
1,必须要在外部函数中,定义内部函数,
2,外部函数有返回值,
3,返回的值:内部函数名
4,内部函数引用了外部函数的变量值。
格式
def 外部函数名():
pass
def 内部函数():
pass
return 内部函数
闭包的应用
特点:
1,保存返回闭包的状态。
2,读取其他的元素的内部变量
3,延长了作用域
4,可以引用同级的函数
闭包总结
- 闭包优化变量,原来需要类对象完成的工作,闭包也能完成
- 由于闭包引用了外部的函数的局部变量,外部函数的局部变量没有及时释放,消耗内存。
- 闭包的好处是,代码更加的简洁,便于阅读代码。
- 闭包的理解是装饰的基础。
装饰器
列子:
def foo():
print("foo")
def func():
print("func")
foo=func
foo()
调用基础平台时,先验证。
要执行开放封闭原则:对以实现的代码不能更改,对扩展代码开放。
装饰器:
##定义装饰器
def decorater(func):
def wrapper():
func()
print("刷漆")
print("铺地板")
print("卖家具")
print("精心装修的房子")
return wrapper
@decorater
def house():
print("毛坯房。。。。")
func=house
整个过程等价:
house=decorater(house)
装饰器的功能:
1,引入日志
2,函数执行时间统计
3,执行函数前的预备功能
4,执行后的清理
5,权限校验
6,缓存
装饰器
遵循开放封闭的原则,在不改变原函数的情况下,扩展函数的功能
定义:
def aaa(func):
def xxx([参数]):
。。。。。
func()
。。。
return yyy
return xxx
带参数的装饰器
##定义装饰器
def decorater(func):
def wrapper(assress):#house 也是wrapper
func(assress) #表示house
print("刷漆")
print("铺地板")
print("卖家具")
print("精心装修的房子")
return wrapper
@decorater
def house(assress):
print("毛坯房{}。。。。".format(assress))
house("四合院")
- 原函数有参数,装饰器的内部也要有参数。
- 想要做到任何都能修饰,参数写成:*agrs 和**kwargs
装饰器修饰有返回值的函数。
原函数有返回值,装饰器的内部函数也要有返回值
需要在装饰器中写return语句,表示调用函数,获取函数的返回值并返回。
要与原函数保持一致。
装饰器带有参数
要知道装饰器也能带参数。