# 11. Python高阶 ### 1. 闭包 ![image-20240311180504651](https://hgh-typora-image.oss-cn-guangzhou.aliyuncs.com/img/image-20240311180504651.png) 在\*\*函数嵌套\*\*的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。 \*\*nonlocal关键字\*\*:需要使用修饰外部函数的变量才可在内部函数中修改外部函数变量。 ![image-20240311180735789](https://hgh-typora-image.oss-cn-guangzhou.aliyuncs.com/img/image-20240311180735789.png) \*\*闭包注意事项:\*\* 优点:使用闭包可以让我们得到: \* 无需定义全局变量即可实现通过函数,持续的访问、修改某个值 \* 闭包使用的变量的所用于在函数内,难以被错误的调用修改 缺点:由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存。 \`\`\`python """ 演示Python的闭包特性 """ # # 简单闭包 # # 使用nonlocal关键字修改外部函数的值 # def outer(num1): # def inner(num2): # nonlocal num1 # num1 += num2 # print(num1) # return inner # # fn = outer(10) # fn(10) # fn(10) # fn(10) # fn(10) # 使用闭包实现ATM小案例 def account_create(initial_amount=0): def atm(num, deposit=True): nonlocal initial_amount if deposit: initial_amount += num print(f"存款:+{num}, 账户余额:{initial_amount}") else: initial_amount -= num print(f"取款:-{num}, 账户余额:{initial_amount}") return atm atm = account_create() atm(100) atm(200) atm(100, deposit=False) \`\`\`