1、装饰器
(1)本质:装饰器本质就是函数,为其他函数添加附加功能
(2)原则:
- 不修改被 修饰函数的源代码
- 不修改被修饰函数的调用方式
(3)装饰器结构
装饰器=高阶函数+函数嵌套+闭包
(4)装饰器举例:
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print("函数的运行时间是%s"%(stop_time-start_time))
return res
return wrapper
@timmer
def cal(l):
res=0
for i in l:
time.sleep(0.1)
res+=i
return res
res=cal(range(20))
print(res)
#输出结果:
函数的运行时间是2.046844005584717
190
*说明:@装饰器名相当于给装饰器赋值,装饰器后面还可以加参数,装饰的只是最外层函数
2、高阶函数定义
函数的参数是一个函数名,函数的返回值是一个函数名,满足以上其中一个就是高阶函数。
3、使用装饰器给函数加认证功能举例
def auth_func(func):
def wrapper(*args,**kwargs):
username=input("用户名:").strip()
passwd=input("密码:").strip()
if username=="lalala" and passwd=="lalala":
res=func(*args,**kwargs)
return res
else:
print("账号或密码错误")
return wrapper
@auth_func
def index():
print("欢迎来到京东主页")
@auth_func
def home(name):
print("欢迎回家%s"%name)
@auth_func
def shopping(name):
print("欢迎%s下次光临"%name)
index()
home("Alex")
shopping("Alex")
说明: 但是以上有个缺点,就是每点击一次界面,都需要输入账密,为了解决这个问题,可以用session优化,即登录一次验证后无需再次登录,代码如下:
user_dic={"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if user_dic["username"] and user_dic["login"]:
res=func(*args,**kwargs)
return res
username=input("用户名:").strip()
passwd=input("密码:").strip()
if username=="lalala" and passwd=="lalala":
user_dic["username"]=username
user_dic["login"]=True
res=func(*args,**kwargs)
return res
else:
print("账号或密码错误")
return wrapper
@auth_func
def index():
print("欢迎来到京东主页")
@auth_func
def home(name):
print("欢迎回家%s"%name)
@auth_func
def shopping(name):
print("欢迎%s下次光临"%name)
index()
home("Alex")
shopping("Alex")
#输出结果:
用户名:lalala
密码:lalala
欢迎来到京东主页
欢迎回家Alex
欢迎Alex下次光临
再次优化,将账号密码放在一个列表里,代码如下:
user_list=[
{"name":"123","passwd":"123"},
{"name":"lalala","passwd":"lalala"},
{"name":"666","passwd":"666"}
]
current_dic={"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic["username"] and current_dic["login"]:
res=func(*args,**kwargs)
return res
username=input("用户名:").strip()
passwd=input("密码:").strip()
for user_dic in user_list:
if username==user_dic["name"] and passwd==user_dic["passwd"]:
current_dic["username"]=username
current_dic["login"]=True
res=func(*args,**kwargs)
return res
else:
print("账号或密码错误")
return wrapper
@auth_func
def index():
print("欢迎来到京东主页")
@auth_func
def home(name):
print("欢迎回家%s"%name)
@auth_func
def shopping(name):
print("欢迎%s下次光临"%name)
index()
home("Alex")
shopping("Alex")
本文深入探讨了Python中的装饰器和高阶函数概念,解释了装饰器的本质、原则和结构,通过实例展示了如何使用装饰器进行函数运行时间测量和用户认证功能的添加。同时,文章还讲解了高阶函数的定义及其在实际编程中的应用。
921

被折叠的 条评论
为什么被折叠?



