每日分享:
生活有望穿秋水的等待,也有意想不到的惊喜。
目录
一、闭包
1. 闭包的介绍
2. 闭包的构成条件
3. 闭包示例
4. 闭包的作用
二、闭包的使用
1. 实现步骤
2. 代码实现
三、nonlocal修改闭包内使用的外部变量
1. 闭包的介绍
函数调用完,函数内定义的变量都会被销毁,但有时候我们需要保存函数内的这个变量,每次在这个变量的基础上完成一系列的操作
闭包的定义:
在函数的嵌套下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,那么这个使用外部函数变量的内部函数称为闭包
2. 闭包的构成条件
- 在函数嵌套的前提下
- 内部函数使用了外部函数的变量、参数
- 外部函数返回了内部函数
3. 闭包示例
# 定义一个外部函数
def func_out():
a = 1
# 定义一个内部函数
def func_inner(b):
sum = a b
print("结果是:", sum)
return func_inner
# 获取闭包对象,这里的new_func就是func_inner,也就是闭包
new_func = func_out()
# 执行闭包
new_func(1)
new_func(2)
通过结果可以看出,闭包保存了外部函数func_out内的变量a,每次执行闭包都是在a=1的基础上进行计算
4. 闭包的作用
- 闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁
注意:
- 由于闭包引用了外部函数的变量,则外部函数的变量就没有及时释放,会消耗内存
用闭包实现两个人的对话:
张三:说话内容
李四:说话内容
1. 实现步骤
- 定义外部函数接收不同的人名信息
- 定义内部函数接收对话信息
- 在内部函数里面把人名和说话内容拼接显示
2. 代码实现
def out(name):
def inner(content):
print(name ':' content)
return inner
a = out("张三")
b = out("李四")
a("在干嘛?")
b("没干嘛")
a("出去玩吗?")
b("去哪啊")
- 闭包还可以提高代码的可重用性,不需要再手动定义额外功能的函数
# 定义一个外部函数
def func_out():
a = 10
# 定义一个内部函数
def func_inner(b):
a = 20
sum = a b
print("结果是:", sum)
print("调用函数前a的值:", a)
func_inner(10)
print("调用函数后a的值:", a)
return func_inner
# 获取闭包对象,这里的new_func就是func_inner,也就是闭包
new_func = func_out()
# 执行闭包
new_func(10)
我们可以发现,调用前后a的值没有变化,但最终计算结果变了,这是因为产生了一个局部变量a,它的值为20,应该使用nonlocal关键字(global也不能修改)
# 定义一个外部函数
def func_out():
a = 10
# 定义一个内部函数
def func_inner(b):
nonlocal a
a = 20
sum = a b
print("结果是:", sum)
print("调用函数前a的值:", a)
func_inner(10)
print("调用函数后a的值:", a)
return func_inner
# 获取闭包对象,这里的new_func就是func_inner,也就是闭包
new_func = func_out()
# 执行闭包
new_func(10)
可以看到,调用前后a的值发生了变化