一:編寫函數(shù),(函數(shù)執(zhí)行時間用time.sleep(n)代表)
import time
def index():
time.sleep(1)
print("歡迎來到index")
index()
二:編寫裝飾器详炬,為函數(shù)加上統(tǒng)計時間的功能
import time
from functools import wraps
def timmer(func):
def wrapper(*args,**kwargs):
strat = time.time()
res = func(*args,**kwargs)
end = time.time()
print(f"運行時間為:{end-strat}")
return res
return wrapper
@timmer
def index():
time.sleep(1)
print("歡迎來到index")
index()
三:編寫裝飾器盐类,為函數(shù)加上認(rèn)證的功能
import time
from functools import wraps
def timmer(func):
def wrapper(*args,**kwargs):
strat = time.time()
res = func(*args,**kwargs)
end = time.time()
print(f"運行時間為:{end-strat}")
return res
return wrapper
def login(func):
def wrapper(*args,**kwargs):
inp_name = input("請輸入用戶名:").strip()
inp_pwd = input("請輸入密碼:").strip()
if inp_name == 'yang' and inp_pwd == '123':
print("登錄成功")
else:
print("登錄失敗")
res = func(*args,**kwargs)
return res
return wrapper
@login
@timmer
def index():
time.sleep(1)
print("歡迎來到index")
index()
四:編寫裝飾器,為多個函數(shù)加上認(rèn)證的功能(用戶的賬號密碼來源于文件)呛谜,要求登錄成功一次在跳,后續(xù)的函數(shù)都無需再輸入用戶名和密碼
注意:從文件中讀出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')轉(zhuǎn)成字典格式
from functools import wraps
def login(func):
def wrapper(*args,**kwargs):
global login_status
if login_status == 1:
res = func(*args,**kwargs)
return res
else:
num = 0
while num < 3:
inp_name = input("username===>:").strip()
inp_pwd = input("password===>:").strip()
with open('day14.txt', mode="r", encoding='utf-8') as f:
for line in f:
list = line.strip('\n').split(":")
if inp_name in list:
if inp_pwd == list[1]:
print("登錄成功")
login_status = 1
num = 3
break
else:
print("密碼錯誤")
num += 1
else:
print("用戶不存在")
num += 1
res = func(*args, **kwargs)
return res
return wrapper
login_status = 0
@login
def f1():
print("from f1")
@login
def f2():
print("from f2")
@login
def f3():
print("from f3")
f1()
f2()
f3()
五:編寫裝飾器隐岛,為多個函數(shù)加上認(rèn)證功能猫妙,要求登錄成功一次,在超時時間內(nèi)無需重復(fù)登錄聚凹,超過了超時時間割坠,則必須重新登錄
import time
from functools import wraps
def login(func):
def wrapper(*args,**kwargs):
global login_status
global login_time
now_time = time.time()
if login_status == 1 :
if now_time<login_time+300:
res = func(*args,**kwargs)
return res
else:
print("登錄超時,請重新登錄")
num = 0
while num < 3:
inp_name = input("username===>:").strip()
inp_pwd = input("password===>:").strip()
with open('day14.txt', mode="r", encoding='utf-8') as f:
for line in f:
list = line.strip('\n').split(":")
if inp_name in list:
if inp_pwd == list[1]:
print("登錄成功")
login_status = 1
login_time = time.time()
num = 3
break
else:
print("密碼錯誤")
num += 1
else:
print("用戶不存在")
num += 1
else:
num = 0
while num < 3:
inp_name = input("username===>:").strip()
inp_pwd = input("password===>:").strip()
with open('day14.txt', mode="r", encoding='utf-8') as f:
for line in f:
list = line.strip('\n').split(":")
if inp_name in list:
if inp_pwd == list[1]:
print("登錄成功")
login_status = 1
login_time = time.time()
num = 3
break
else:
print("密碼錯誤")
num += 1
else:
print("用戶不存在")
num += 1
res = func(*args, **kwargs)
return res
return wrapper
@login
def f1():
print("from f1")
@login
def f2():
print("from f2")
@login
def f3():
print("from f3")
login_status = 0
login_time = 0
f1()
f2()
f3()
六:編寫下載網(wǎng)頁內(nèi)容的函數(shù)妒牙,要求功能是:用戶傳入一個url彼哼,函數(shù)返回下載頁面的結(jié)果
七:為題目五編寫裝飾器,實現(xiàn)緩存網(wǎng)頁內(nèi)容的功能:
具體:實現(xiàn)下載的頁面存放于文件中湘今,如果文件內(nèi)有值(文件大小不為0)沪羔,就優(yōu)先從文件中讀取網(wǎng)頁內(nèi)容,否則象浑,就去下載,然后存到文件中
擴展功能:用戶可以選擇緩存介質(zhì)/緩存引擎琅豆,針對不同的url愉豺,緩存到不同的文件中
八:還記得我們用函數(shù)對象的概念,制作一個函數(shù)字典的操作嗎茫因,來來來蚪拦,我們有更高大上的做法,在文件開頭聲明一個空字典冻押,然后在每個函數(shù)前加上裝飾器驰贷,完成自動添加到字典的操作
from functools import wraps
d = {}
def add_dic(func):
def wrapper(*args,**kwargs):
d.update({func.__name__:func})
res = func(*args,**kwargs)
return res
return wrapper
@add_dic
def f1():
print("from f1")
@add_dic
def f2():
print("from f2")
@add_dic
def f3():
print("from f3")
九 編寫日志裝飾器,實現(xiàn)功能如:一旦函數(shù)f1執(zhí)行洛巢,則將消息2017-07-21 11:12:11 f1 run寫入到日志文件中括袒,日志文件路徑可以指定
注意:時間格式的獲取
import time
time.strftime('%Y-%m-%d %X')
import time
from functools import wraps
def log_w_outter(filepath):
def log_w(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
with open(filepath,'a',encoding='utf-8') as f:
log = time.strftime('%Y-%m-%d %H:%M:%S {} run' .format(func.__name__))
f.write(log+'\n')
return res
return wrapper
return log_w
@log_w_outter(filepath='day14.txt')
def f1():
print("from f1")
f1()