Enclosing 外部嵌套作用域 内部函数可以读取外部函数变量 如果修改必须使用nonlocal声明
def func03():
a = 10
def func04():
# a = 20 # 创建了func04的局部变量
nonlocal a
a = 20
print("func04,",a) # 20
闭包 三大要素: 有外有内 内访问外 外返回内 作用: 外部函数栈帧执行过后不释放, 供内部函数使用
def func01():
a = 10
def func02():
print(a)
return func02
# 调用外函数,返回内部函数
result = func01() # 【外部函数栈帧没释放】
# 调用内部函数
result() # 【可以访问外部函数变量】
闭包应用:
逻辑连续
创建的变量存储空间不会消失
def give_gife_money(money): # 得钱
print("获得", money, "元压岁钱")
def child_buy(commodity, price): # 花钱
nonlocal money
money -= price
print("购买了", commodity, "花了", price, "元,还剩下", money)
return child_buy
# 调用外部函数
action = give_gife_money(500)
# 调用内部函数
action("变形金刚", 200) #还剩300
action("芭比娃娃", 300) #还剩0
装饰器 在不改变旧功能基础上,增加新功能 核心逻辑: 拦截调用
装饰器 - 语法细节 内函数返回值:旧功能的返回值
def new_func(func):
def wrapper(*args, **kwargs): # 多合一
print("新功能")
result = func(*args, **kwargs) # 一拆多
return result
return wrapper
@new_func
def func01(p1):
print("旧功能1,参数:", p1)
return 10
@new_func
def func02(p1, p2):
print("旧功能2,参数:", p1, p2)
return 20
# 调用内函数
print(func01(100)) # 10
print(func02(200, 300)) # 20
func02(p1=400, p2=500)