Python高级
Python高级-闭包函数
Python高级-闭包函数,装饰器教程
闭包
学习目标:
能够知道闭包的构成条件
能够知道定义闭包的语法格式
1. 闭包的介绍
我们前面已经学过了函数,我们知道当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一些列的操作,比如: 每次在这个变量的基础上和其它数字进行求和计算,那怎么办呢?
我们就可以通过咱们今天学习的闭包来解决这个需求。
闭包的定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
2. 闭包的构成条件
1,在函数嵌套(函数里面再定义函数)的前提下
2,内部函数使用了外部函数的变量(还包括外部函数的参数)
3,外部函数返回了内部函数
3. 简单闭包的示例代码
# 定义一个外部函数 def func_out(num1): # 定义一个内部函数 def func_inner(num2): # 内部函数使用了外部函数的变量(num1) result = num1 + num2 print("结果是:", result) # 外部函数返回了内部函数,这里返回的内部函数就是闭包 return func_inner # 创建闭包实例 f = func_out(1) # 执行闭包 f(2) # 3 f(3) # 4
闭包执行结果的说明:通过上面的输出结果可以看出闭包保存了外部函数内的变量num1,每次执行闭包都是在num1 = 1 基础上进行计算。
4. 闭包的作用
闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。
注意点:由于闭包引用了外部函数的变量,则外部函数的变量没有及时释放,消耗内存。
5. 小结
1,当返回的内部函数使用了外部函数的变量就形成了闭包
2,闭包可以对外部函数的变量进行保存
3,实现闭包的标准格式:
# 外部函数 def test1(a): b = 10 # 内部函数 def test2(): # 内部函数使用了外部函数的变量或者参数 print(a, b) # 返回内部函数, 这里返回的内部函数就是闭包实例 return test2
闭包的使用
学习目标,能够知道闭包的作用
1. 案例
需求: 根据配置信息使用闭包实现不同人的对话信息,例如对话:
张三: 李雷: 吃饭了吗?
李四: 还没吃呢,一起吃不?
2. 实现步骤说明
1,定义外部函数接收不同的配置信息参数,参数是人名
2,定义内部函数接收对话信息参数
3,在内部函数里面把配置信息和对话信息进行拼接输出
3. 功能代码的实现
# 需求: 根据配置信息使用闭包实现不同人的对话信息,例如对话: # 李雷: 吃饭了吗? # 韩梅梅: 还没吃呢,一起吃不? def name(name): def say(say_info): print('%s:%s'%(name,say_info)) return say lilei = name('李雷') lilei('吃饭了吗?') hanmeimei = name('韩梅梅') hanmeimei('还没吃呢,一起吃不?') ###输出结果 # 李雷:吃饭了吗 # 韩梅梅:还没吃呢,一起吃不?
闭包案例说明:闭包函数还可以提高代码的可重用性,不需要再手动定义额外的功能函数。
小结:闭包不仅可以保存外部函数的变量还可以提高代码的可重用行。
修改闭包内使用的外部变量
学习目标:能够知道修改闭包内使用的外部变量所需要的关键字
修改闭包内使用的外部变量的错误示例:
# 定义一个外部函数 def func_out(num1): # 定义一个内部函数 def func_inner(num2): # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1 num1 = 10 # 内部函数使用了外部函数的变量(num1) result = num1 + num2 print("结果是:", result) print(num1) func_inner(1) print(num1) # 没有修改,结果仍然是外部函数的 # 外部函数返回了内部函数,这里返回的内部函数就是闭包 return func_inner # 创建闭包实例 f = func_out(1) # 执行闭包 f(2) # 12
修改闭包内使用的外部变量的正确示例:
# 定义一个外部函数 def func_out(num1): # 定义一个内部函数 def func_inner(num2): # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1 nonlocal num1 # 告诉解释器,此处使用的是 外部变量a # 修改外部变量num1 num1 = 10 # 内部函数使用了外部函数的变量(num1) result = num1 + num2 print("结果是:", result) print(num1) func_inner(1) print(num1) # 此处使用的修改后的外部变量 # 外部函数返回了内部函数,这里返回的内部函数就是闭包 return func_inner # 创建闭包实例 f = func_out(1) # 执行闭包 f(2) # 12
最后修改:2020年3月7日 00:26