app和网站的关系/怎么写软文
引入闭包
我们知道当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的某个变量,每次在这个变量的基础上完成一些列的操作,比如:每次在这个变量的基础上和其它数字进行求和计算,那怎么办呢?
我们就可以通过咱们今天学习的闭包来解决这个需求。
1 闭包的定义
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数
称为闭包
。
- 闭包的构成条件
① 在函数嵌套(函数里面再定义函数)的前提下
② 内部函数使用了外部函数的变量(还包括外部函数的参数)
③ 外部函数返回了内部函数
2 简单闭包的示例代码
def func_out(num1):def func_inner(num2): # 内部函数使用了外部函数的变量(num1)result = num1 + num2print("结果是:", result)return func_inner # 外部函数返回了内部函数,这里返回的内部函数就是闭包f = func_out(1) # 创建闭包实例
f(2) # 执行闭包 1 + 2 = 3
f(3)
===运行结果:=================================================================
结果是: 3
结果是: 4
2.1
闭包执行结果的说明
- 通过上面的输出结果可以看出闭包保存了外部函数内的变量num1,每次执行闭包都是在num1 = 1 基础上进行计算;
- 闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁;
- 由于闭包引用了外部函数的变量,则外部函数的变量没有及时释放,消耗内存。
2.2
实现闭包的标准格式
def out(a):b = 10def inner(): # 内部函数使用了外部函数的变量或者参数print(a, b)return inner # 返回内部函数, 这里返回的内部函数就是闭包实例
3 闭包的使用
示例: 使用闭包,实现不同人的对话
def config_name(name):def say_info(info):print(name + ": " + info)return say_infotom = config_name("Tom")
jerry = config_name("jerry")
tom("hey, jerry! 我们一起玩吧!")
jerry("呵呵哒, 不和你玩!")
tom("来呀~ 来呀~")
jerry("滚犊子!")===运行结果:=================================================================Tom: hey, jerry! 我们一起玩吧!
jerry: 呵呵哒, 不和你玩!
Tom: 来呀~ 来呀~
jerry: 滚犊子!
- 闭包案例说明:闭包不仅可以保存外部函数的变量还可以提高代码的复用性。
4 在闭包内部修改闭包外部变量
(nonlocal
)
def func_out(num1):def func_inner(num2):nonlocal num1 # 告诉解释器,此处使用的是外部变量num1num1 = 10 # 修改外部变量num1result = num1 + num2 # 内部函数使用了外部函数的变量(num1)print("计算结果:", result)print("num1:", num1)func_inner(1)print("num1:", num1)return func_innerf = func_out(3)
f(2)===运行结果:=================================================================num1: 3
计算结果: 11
num1: 10 # 闭包内,修改外部变量成功
计算结果: 12
没有使用nonlocal
的示例:
def func_out(num1):def func_inner(num2):num1 = 10 # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1result = num1 + num2 # 内部函数使用了外部函数的变量(num1)print("计算结果:", result)print("num1:", num1)func_inner(1)print("num1:", num1)return func_innerf = func_out(3)
f(2)===运行结果:=================================================================num1: 3
计算结果: 11
num1: 3 # 闭包内,修改外部变量失败
计算结果: 12
闭包内不做变量的修改(作为对比,便于理解)
def func_out(num1):def func_inner(num2):result = num1 + num2print("计算结果:", result)print("num1:", num1)func_inner(1)print("num1:", num1)return func_innerf = func_out(3)
f(2)===运行结果:=================================================================num1: 3
计算结果: 4
num1: 3
计算结果: 5