python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂
十六、闭包
16.1、认识闭包
>闭包的定义:在函数嵌套的前提下,内部函数使用了外部函数的变量(而如果内部函数里引用了外部函数里定义的对象(甚至是外层之外,但不是全局变量),那么此时内部函数就被称为闭包函数)并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
>闭包的作用:可以保存外部函数内的变量
>构成条件:
a、在函数嵌套(函数里面再定义函数)的前提下
b、内部函数使用了外部函数的变量或参数
c、外部函数返回了内部函数
# 1、函数嵌套(形成闭包)
def func_out(): # 外部函数
num1 = 10 # 外部函数的变量
def func_inner(num2): # 内部函数
result = num1 + num2
print(f"结果是:{result}")
return func_inner # c、外部函数返回了内部函数,所谓的闭包指的就是使用了外部函数的变量的内部函数
new_func = func_out() # mew_func = func_inner 1.获取闭包 2.执行闭包:就是在执行内部函数中的代码
new_func(20)
new_func(13)
# 结果:
>>> 结果是:30
>>> 结果是:23
16.2、闭包的使用
需求:根据配置信息使用闭包实现不同人的对话信息 例如对话:老板:丽丽到家了吗? 小徐:到家了 老板:到家多久了 小徐:已经睡着了,放心吧!
‘’’ 实现步骤:
a、定义外部函数接收不同的配置信息参数,参数是人名
b、定义内部函数接收对话信息参数
c、在内部函数里面把配置信息和对话信息进行拼接输出 ‘’’
def waibu_method(name): # 外部函数接收姓名参数
def neibu_method(msg): # 内部函数接收对话信息
print(name + ":" + msg)
return neibu_method # 外部函数返回了内部函数
# 获取闭包
wang = waibu_method("王总")
xu = waibu_method("小徐")
# 执行闭包
wang("丽丽到家了吗?")
xu("到家了")
wang("到家多久了")
xu("已经睡着了,放心吧!")
# 结果:
>>> 王总:丽丽到家了吗?
>>> 小徐:到家了
>>> 王总:到家多久了
>>> 小徐:已经睡着了,放心吧!
16.3、使用闭包保存外部函数中的变量
# 函数嵌套
def wbhs(): # 外部函数
num1 = 10
def nbhs(): # 内部函数# 内部函数使用了外部函数的变量或参数
# global num1 # 在闭包中,在函数嵌套中不能使用global修改局部变量
nonlocal num1 # 总结:在函数嵌套中需要使用nonlocal去声明为全局变量
num1 = 18
num3 = num1 + 16
print(num3)
# 修改前的num1
print("修改前:", num1)
nbhs()
# 修改后num1
print("修改后:", num1)
return nbhs # 外部函数返回了内部函数,所谓的闭包指的就是使用了外部函数的变量的内部函数
nb = wbhs()
nb()
# 结果:
>>> 修改前: 10
>>> 34
>>> 修改后: 18
>>> 34