一、闭包
闭包由两部分组成:
- 外部函数:定义了闭包的外部环境。
- 内部函数:实际的闭包,它可以访问并操作外部函数的变量。
- 在闭包中,外部函数嵌套内部函数,外部函数返回内部函数,内部函数可以访问外部函数的变量(nonlocal)
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter())
print(counter())
print(counter())
import random
def fun1():
datas = []
def fun2():
datas.append(random.randint(0, 100))
print("fun2", datas)
return fun2
r = fun1()
r()
r()
r()
r()
二、装饰器
装饰器本质上是一个闭包。装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数。这个新的函数可以添加额外的功能,同时保持原有函数的调用方式不变。
def timer(func):
def clo():
start = time.time()
result = func()
end = time.time()
print(f" 执行用了 {end - start} 秒。")
return result
return clo
@timer
def example():
time.sleep(1) # 模拟耗时操作
return "函数完成"
print(example())
执行用了 1.1788480281829834 秒。
函数完成
三、装饰器案例
简单的购物需登录案例
user =None
def login_required(f):
def check():
global user
if user:
f()
else:
while True:
username = input("请输入用户名")
password = input("亲输入密码")
if username == "admin" and password == "123456":
user="admin"
f()
break
else:
print("用户名或者密码错误")
return check
def index():
print(f"我是首页")
@login_required
def center():
print("我是个人中心")
@login_required
def cart():
print("我是购物车")
index()
center()
cart()