闭包函数:在一个函数体内嵌套函数,是一个函数对象,允许在内部函数中修改或引用外部函数的变量
闭包函数对数据有封存功能
闭包函数需要满足以下几个条件:
1.函数必须有一个嵌套函数,在定义函数时,内部再定义一个函数
2.内部函数必须引用外部函数的变量,如果需要修改变量,必须使用关键字 nonlocal 声明变量
3.外部函数的返回值必须是内部函数名
闭包函数基本格式:
def 外部函数(外部函数形参):变量 = 外部函数形参def 内部函数(内部函数形参):'如果修改外部函数的变量,必须使用关键字 nonlocal 声明变量'nonlocal 变量变量 += 内部函数形参return f'内部函数的返回值{变量}'return 内部函数 # 外部函数的返回值# 创建闭包函数
闭包函数 = 外部函数('实参') # 通过闭包函数加小括号调用
print(type(闭包函数)) # <class 'function'># 调用闭包函数:当执行调用外部函数后,返回值是函数名(内部函数),赋值给闭包函数(函数对象)
闭包函数()
案例 1:创建一个计数器
# 创建计数器
def create_count(count = 0):'定义一个函数,count初始值为0'def counter():nonlocal count # 声明count变量count += 1 # 改变外部函数的变量return countreturn counter # 外部函数返回内部函数的名称# 创建闭包函数
count_num = create_count() # count_num 函数对象for _ in range(10):print(count_num()) # 调用函数时加小括号
执行结果如下:
案例 2:定义一个计算器,实现 add 加法和 sub 减法
# 案例:定义一个计算器,实现add加法和sub减法
def calc():totol = 0def add(value):nonlocal totoltotol += valuereturn totoldef sub(value):nonlocal totoltotol -= valuereturn totolreturn add, sub# 创建闭包函数
res_add, res_sub = calc()# 调用闭包函数
print(res_add(100)) # 0+100=100
print(res_add(20)) # 100+20=120
print(res_sub(40)) # 120-40=80
print(res_add(10)) # 80+10=90
print(res_sub(80)) # 90-80=10
执行结果如下:
案例 3:通过闭包函数,实现银行账号的存款和取款功能
# 案例:实现银行账号的存款和取款功能
def bank_account(balance = 0):# 存款def deposit(amount):nonlocal balancebalance += amountreturn balance# 取款def withdraw(amount):nonlocal balanceif amount > balance:return '余额不足'else:balance -= amountreturn balancereturn deposit, withdraw# 创建闭包函数
res_deposit, res_withdraw = bank_account()# 调用闭包函数
print(res_withdraw(3000)) # 0-3000=余额不足
print(res_deposit(5000)) # 0+5000=5000
print(res_withdraw(2000)) # 5000-2000=3000
print(res_deposit(100)) # 3000+100=3100
print(res_withdraw(4000)) # 3100-4000=余额不足
执行结果如下: