一般来说,函数执行完之后函数内部的变量是要被销毁的。
但是我们想在这个变量的基础的上完成一系列的操作呢,行不行呢?
在python,答案是:可以!
我们可以通过用闭包去实现!
闭包的定义是什么?
闭包:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数(其实就是内部函数的地址拉),我们把这个使用外部函数的内部函数成为闭包。
闭包的作用:保存函数内的变量,不会随着函数的调用完而被销毁。
那闭包的使用需要在什么条件下激活呢?
1.在函数嵌套的前提下(就是函数内部再定义一个函数)
2.内部函数使用了外部函数的变量(还包含外部函数的参数)
3.外部函数返回了内部函数的地址
小文章分三点去写:
1.闭包案列
2.函数地址
3.通过nonlocal去修改闭包的外部变量
1.闭包案例
实际使用的代码案列:
# 1.在函数嵌套的前提下(就是函数内部再定义一个函数)
def external(num1):
def inside(num2):
# 2.内部函数使用了外部函数的变量(还包含外部函数的参数)
num = num1 + num2
print("现在的值:",num)
# 3.外部函数返回了内部函数的地址
return inside
# 创建闭包
f = external(10)
# 执行闭包
f(1)
f(2)
运行结果:
现在的值: 11
现在的值: 12
由这里可以看出我们确实在参数num1的基础上,再加上num2传入的1和2之后得到我们的11和12这两个值。
# 3.外部函数返回了内部函数的地址
return inside
这里其实最重要的一步,返回了我们的内部函数的地址
这样的话
# 创建闭包
f = external(10)
调用外部函数后,得到是内部函数的地址
# 执行闭包
f(1)
f(2)
然后执行闭包,相当执行我们函数inside(1)和inside(2)
这样的话我们就可以得到11和12了!!!
2.函数地址
# 先定义一个函数呗
def func():
print("您好,靓仔靓女们!祝您生活美好!")
# 我们试着打印一下func
print(func)
得到结果:
<function func at 0x0000021E04A92620>
这里表示:函数func的地址是:0x0000021E04A92620
所以说呀函数名实际上就是函数的地址罢了!!!
3.闭包的外部变量通过nonlocal去修改
# 外部函数
def external(num1):
# 内部函数
def inside(num2):
# 没有nonlocal之前,num1只是inside函数里面的局部变量所以我们不能改变外部变量(只是名字相同罢了)
# nonlocal num1
num1 = 100 + num2
print("现在的值:", num1)
inside(10)
print("现在的值:",num1)
return inside
# 创建闭包
f = external(10)
# 执行闭包
f(1)
f(2)
这里的结果是:
现在的值: 10
现在的值: 10
# 外部函数
def external(num1):
# 内部函数
def inside(num2):
# 没有nonlocal之前,num1只是inside函数里面的局部变量所以我们不能改变外部变量(只是名字相同罢了)
nonlocal num1
num1 = 100 + num2
print("现在的值:", num1)
inside(10)
print("现在的值:",num1)
return inside
# 创建闭包
f = external(10)
# 执行闭包
f(1)
f(2)
解除注释之后输出的结果是:
现在的值: 10
现在的值: 110
好了今天就说这么多了!
感谢各位!
一名分享自己学习经历的小白!
如果哪方面描述错误请不要责怪我,请多多指教!!