萌新学 Python 之闭包函数
闭包函数:在一个函数体内嵌套函数,是一个函数对象,允许在内部函数中修改或引用外部函数的变量
闭包函数对数据有封存功能
闭包函数需要满足以下几个条件:
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 count
return counter # 外部函数返回内部函数的名称
# 创建闭包函数
count_num = create_count() # count_num 函数对象
for _ in range(10):
print(count_num()) # 调用函数时加小括号
执行结果如下:
案例 2:定义一个计算器,实现 add 加法和 sub 减法
# 案例:定义一个计算器,实现add加法和sub减法
def calc():
totol = 0
def add(value):
nonlocal totol
totol += value
return totol
def sub(value):
nonlocal totol
totol -= value
return totol
return 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 balance
balance += amount
return balance
# 取款
def withdraw(amount):
nonlocal balance
if amount > balance:
return '余额不足'
else:
balance -= amount
return balance
return 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=余额不足
执行结果如下: