闭包和装饰器是 Python 中常用的高级特性。下面分开讲两个用法。
一、闭包:
闭包是指函数内部定义的函数,可以访问外部函数的变量,即使外部函数已经执行完毕。
分以下三步:
外部函数嵌套内部函数
外部函数返回内部函数
内部函数可以访问外部函数局部变量(内部函数修改外部函数局部变量用nonlocal)。
i = 1000
def my_fun1():
# 声明新的局部变量i = 10
i = 10
print("myfun1", i)
def my_fun2():
j = 20
nonlocal i
i = i + 1
print("myfun2", i, j)
return my_fun2
r = my_fun1()
r()
r()
r()
r()
输出:
myfun1 10
myfun2 11 20
myfun2 12 20
myfun2 13 20
myfun2 14 20
二、装饰器:
装饰器是一种修改其他函数行为的函数,可以在不改变原函数代码的情况下,为函数添加额外的功能。
三、装饰器案例:
以下是装饰器案例:
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("我是购物车")
center()
cart()
空置user,当访问首页时会发送登录请求,如果存在该用户,那么将user重新定义成True,装饰器在其他函数中可以正常通过。
有一段时光/用来浪费和挥霍
有一些人/陪你一起张牙舞爪
多年后我想起来/这被称之为青春
你依旧是我心中/最值得纪念的那个人。