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")