闭包
定义双层嵌套函数,内层函数可以访问外层函数的变量。
将内层函数作为外层函数的返回,此内层函数就是闭包函数。
account_amount = 0 # 账户余额
def atm(num, deposit=True):
global account_amount;
if deposit:
account_amount += num
print(f"存款:+{num},账户余额:{account_amount}")
else:
account_amount -= num
print(f"取款:-{num},账户余额:{account_amount}")
atm(300)
atm(300)
atm(100, False)
上面的取款和存款代码存在问题:
1.代码在命名空间上(变量定义)不够干净、整洁。
2.全局变量有被修改的风险。
使用闭包改造代码
函数嵌套
def outer(logo):
def inner(msg):
print(f"<{logo}>{msg}<{logo}>")
return inner
ff = outer("哈哈")
# <哈哈>aa<哈哈>
ff("aa")
修改外部函数变量的值使用nonlocal关键字修饰
def outer(num1):
def inner(num2):
nonlocal num1
num1 += num2
print(num1)
return inner
fn = outer(10)
# 15
fn(5)
闭包的好处
1.无需定义全局变量即可实现通过函数,持续的访问、修改某个值。
2.闭包使用的变量所用于在函数内,难以被错误的调用修改。
缺点
由于内部函数持续引用了外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存。