闭包
闭包是双层嵌套函数,内层函数可以访问外层函数的变量,将内层函数作为外层函数的返回,此内层函数就是闭包函数
优点:
不定义全局变量,也可以让函数持续访问和修改一个外部变量
闭包函数引用的外部变量,是外层函数的内部变量,作用域封闭难以被误操作修改
缺点:
额外的内存占用
nonlocal关键字:在闭包函数(内部函数中)想要修改外部函数的变量值,需要用nonlocal声明这个外部变量
举例:
def atm(account_amount=0):
print(f"账户余额:{account_amount}")
def func(num, deposit=True):
nonlocal account_amount
if deposit:
account_amount += num
print(f"存款:+{num},账户余额:{account_amount}")
else:
account_amount -= num
print(f"取款:-{num},账户余额:{account_amount}")
return func
fn = atm()
fn(100)
fn(100)
fn(100, False)
装饰器
装饰器就是使用创建一个闭包函数,在闭包函数内调用目标函数,可以达到不改动目标函数的同时,增加额外的功能
一般写法(闭包写法):
def outer(func):
def inner():
print("我要睡觉了")
func()
print("我起床了")
return inner
def sleep():
import random
import time
print("睡眠中......")
time.sleep(random.randint(1, 5))
fn = outer(sleep)
fn()
装饰器写法:
def outer(func):
def inner():
print("我要睡觉了")
func()
print("我起床了")
return inner
@outer
def sleep():
import random
import time
print("睡眠中......")
time.sleep(random.randint(1, 5))
sleep()