闭包函数:
在编程语言中,闭包(也称为词法闭包或函数闭包)是在具有一流函数的语言中实现词法范围的名称绑定的一种技术。操作,一个闭包是一个记录存储功能加上一个环境:映射关联每个自由变量的函数(在本地变量使用,但是一个封闭范围中定义)的价值或存储位置的名字创建绑定时关闭。与普通函数不同,闭包允许函数通过访问捕获的变量。内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包。函数函数在定义阶段名字的查找顺序就已经固定死了不会因为函数调用位置的变化而改变。
我们来看看要实现函数闭包要满足什么条件(缺一不可):
1.必须嵌套函数。
2.内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3.外部函数必须返回内嵌函数——必须返回那个内部函数
闭包的作用:可以保持程序上一次运行后的状态然后继续执行,稳定性较高
例1是没有传参的定义闭包函数
def func01():
m = 1
print("我是func01")
def func02():
c = m + 100
print("我是func02")
print(c)
return func02
func01()()
res = func01()
res()
F:\pythonProjec\TestRequests\venv\Scripts\python.exe F:/pythonProjec/TestRequests/test001/ck_study_day_03.py
我是func01
我是func02
101
我是func01
我是func02
101
Process finished with exit code 0
例2带有参数调用
def func01(i):
print("我是func01")
def func02():
c = i + 100
print("我是func02")
print(c)
return func02
func01(4)()
res = func01(4)
res()
F:\pythonProjec\TestRequests\venv\Scripts\python.exe F:/pythonProjec/TestRequests/test001/ck_study_day_03.py
我是func01
我是func02
104
我是func01
我是func02
104
Process finished with exit code 0
传个闭包函数的是局部变量,我可以读取res._ closure _这个局部变量
def func01(i,str):
print("我是func01")
def func02():
c = i + 100
print("我是func02")
print(str)
print(c)
return func02
func01(4,"liuyaqi")()
res = func01(4,'liuyaqi')
res()
#打印传个闭包函数的非全局变量
print(res.__closure__)
F:\pythonProjec\TestRequests\venv\Scripts\python.exe F:/pythonProjec/TestRequests/test001/ck_study_day_03.py
我是func01
我是func02
liuyaqi
104
我是func01
我是func02
liuyaqi
104
(<cell at 0x00000285CBF09A38: int object at 0x00007FFD16CB7CA0>, <cell at 0x00000285CC0693D8: str object at 0x00000285CC01F830>)
Process finished with exit code 0