1 闭包
什么是闭包:
定义双层嵌套函数,内层函数可以访问外层函数的变量,将内存函数作为外层函数地返回值,此内层函数就是闭包函数
1.1 简单闭包
可以让内部函数可以用外部函数的变量
# 1.简单闭包 -> 可以让内部函数可以用外部函数的变量
def outer(logo):
def inner(msg):
print(f"<{logo}>{msg}<{logo}>")
return inner
f1 = outer('Hello')
f1("python")
1.2 nonlocal关键字
使用nonlocal关键字,在闭包函数中,可以修改外部函数的变量
# 2. 使用nonlocal关键字,在闭包函数中,可以修改外部函数的变量
def outer(num1):
def inner(num2):
nonlocal num1
num1 = 100
print(num1 + num2)
return inner
f1 = outer(10)
f1(20)
1.3 使用闭包实现ATM案例
def account_create(initial_amount=0):
def atm(num, deposit=True):
nonlocal initial_amount
if deposit:
initial_amount += num
print(f"账户余额为:{initial_amount}")
else:
initial_amount -= num
print(f"账户余额为:{initial_amount}")
return atm
atm = account_create(100) # 调用一次,值可以保留下来
atm(20, False)
1.4 总结
优点:
1.无需定义全局变量即可实现通过函数,持续访问、修改某个值
2.闭包函数引用的外部变量,是外层函数的内部变量。作用域封闭难以被错误修改
缺点:内存不释放,占用内存
2 装饰器
装饰器其实也是一种闭包,在闭包函数内调用目标函数,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新的功能
# 1.装饰器的一般写法(闭包)
def sleep():
import random
import time
print("睡觉中...")
time.sleep(random.randint(1, 6))
def outer(func):
def inner():
print("早上好")
func()
print("晚上好")
return inner
fn1 = outer(sleep)
fn1()
# 2. 装饰器的语法糖写法
def outer(func):
def inner():
print("早上好")
func()
print("晚上好")
return inner
@outer
def sleep():
import random
import time
print("睡觉中...")
time.sleep(random.randint(1, 6))
sleep()