每日分享:
生活有望穿秋水的等待,也有意想不到的惊喜。
目录
一、闭包
1. 闭包的介绍
2. 闭包的构成条件
3. 闭包示例
4. 闭包的作用
二、闭包的使用
1. 实现步骤
2. 代码实现
三、nonlocal修改闭包内使用的外部变量
一、闭包 1. 闭包的介绍函数调用完,函数内定义的变量都会被销毁,但有时候我们需要保存函数内的这个变量,每次在这个变量的基础上完成一系列的操作
闭包的定义:
在函数的嵌套下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,那么这个使用外部函数变量的内部函数称为闭包
2. 闭包的构成条件- 在函数嵌套的前提下
- 内部函数使用了外部函数的变量、参数
- 外部函数返回了内部函数
# 定义一个外部函数 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. 实现步骤- 定义外部函数接收不同的人名信息
- 定义内部函数接收对话信息
- 在内部函数里面把人名和说话内容拼接显示
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的值发生了变化