闭包定义:
1.函数嵌套
2.内部函数使用外部函数
3.返回内部函数
#定义外部函数
def outer(n):
#定义内部函数
def inner():
b=10
#调用外部函数参数
a=b+n
c=b/2
print(a)
return c
#返回内部函数
return inner
r=outer(5)
print(r)
#返回outer函数的地址
out:<function outer.<locals>.inner at 0x000002578159C0D0>
#调用inner函数
r()
out:
15
print(r())
out:
15
5.0
2.装饰器 decorater
- 装饰器遵循开放封闭原则,及原函数是封闭的,但是可以通过装饰器来修改原函数。
- 装饰器其本质就是闭包,是特殊的闭包函数。
def decorater(func):
print('------------>>>>1')
def inner():
func()
print('开始水电安装')
print('开始刷漆')
print('开始铺地板')
print('装修完成')
print('--------------->>2')
return inner
@decorater
def house():
print('这是一个毛坯房')
house()
out:
------------>>>>1
--------------->>2
这是一个毛坯房
开始水电安装
开始刷漆
开始铺地板
装修完成
def decorater(func):
print('------------>>>>1')
#house带参数 inner也必须带参数,func也要带参数
def inner(area):
func(area)-------------->>house
print('开始水电安装')
print('开始刷漆')
print('开始铺地板')
print('装修完成')
print('--------------->>2')
return inner
@decorater
def house(area):
print('这是一个毛坯房面积是%d平方米' %area)
house(50)
out:
------------>>>>1
--------------->>2
这是一个毛坯房面积是50平方米
开始水电安装
开始刷漆
开始铺地板
装修完成
def decorater(func):
print('------------>>>>1')
#*args可以将参数当成一个元组传入
def inner(*args):
func(*args)------------->>拆包,将元组拆分成一个个参数
print('开始水电安装')
print('开始刷漆')
print('开始铺地板')
print('装修完成')
print('--------------->>2')
return inner
@decorater
def house(area,k,n):
print('这是一个毛坯房面积是%d平方米,是%d房%d厅' %(area,k,n))
house(50,3,2)
out;
------------>>>>1
--------------->>2
这是一个毛坯房面积是50平方米,是3房2厅
开始水电安装
开始刷漆
开始铺地板
装修完成
装饰器的使用场景:
- 引入日志
- 函数执行时间统计
- 执行函数前预备处理
- 执行函数前的清理功能
- 权限效验等