闭包
构成条件
有以下三个条件:
①在函数嵌套(函数里面再定义函数)的前提下
②内部函数使用了外部函数的变量(还包括外部函数的参数)
③外部函数返回了内部函数
闭包流程图
下面这个图片画的很清晰,执行func_out这个函数时,第4行到第7行不执行
直接执行return语句
闭包的使用
def config_name(name):
# 内部函数
def say_info(info):
print(name + ": " + info)
return say_info
tom = config_name("Tom")
tom("你好!")
tom("你好, 在吗?")
修改闭包内使用的外部变量
使用nonlocal关键字
# 定义一个外部函数
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)
装饰器
定义
给已有功能函数增加额外功能的函数。
特点
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
装饰器流程图
语法糖写法
def check(fn):
print("装饰器函数执行了")
def inner():
print("请先登录....")
fn()
return inner
# 使用语法糖方式来装饰函数
@check
def comment():
print("发表评论")
comment()
@check 等价于 comment = check(comment)