有參裝飾器,在針對帳號的不一樣來源,還需定製不一樣的認證方式:python
在基於不一樣方式認證能夠在原先的兩層函數上套用第三層函數,緣由在於:app
一、最內層的函數定義括號內帶有wrapper(*args,**kwargs)是不能變動,這是爲了在其內部的func是要在裝飾器內找到對應原函數的值以及傳值。函數
二、內層的外一層函數outter(func)也是不能去更變,這是對照原函數的傳值設置。spa
三、最外層是能夠增長函數用來內部判斷哪一種渠道能夠進行認證,而且第三層最爲裝飾器的添加層在括號內能夠無限制的添加。對象
import time
dic={"name":None}#用來記錄帳號是否登入過,以及登入後多少時間內不用從新輸入帳號
def suth(engine="file"):#第三層能夠加無限制內容,目前加的是從哪一個地方認證的登入篩選
def outter(func):
def warpper(*args,**kwargs):
if dic["name"]:
res=func(*args,**kwargs)
retiurn res
#已經登入過就再也不重複輸入帳號密碼
name = input("username:").strip()
pwd = input("password:").strip()
if engine == "file":
with open(r"E:\PycharmProjects\king\做業\name.txt","r",encoding="utf-8") as f:
for k in f:#基於文件認證
k = k.strip("\n")
info= k.split(",")
if name == info[0] and pwd == info[1]:
print("login successful")
dic["name"]=name#記錄用戶登入狀態
res=func(*args,**kwargs)
return res
else:
print("帳號密碼錯誤")
elif engine == "mode":
print("基於mode認證")
else:
print("基於其餘認證來源")
return warpper
return outter
@suth(engine = "file")#suth(engine = "file")調用是進入outter
def index():
print("welcome to index")
time.sleep(2)
@suth(engine = "mode")#不一樣的engine 表明不一樣地方進入的渠道來源
def home(name):
print("welcome %s to home" %name)
time.sleep(0.5)
index()
home("yf")
迭代器:
什麼是迭代器?
迭代器是一個重複過程,每一次重複都是基於上一次的結果而來的
單純的重複並非迭代
while True:
print('1111')索引
迭代:
l=['a','b','c']ip
def iterator(item):
i=0
while i < len(item):
print(l[i])
i+=1內存
爲何要迭代器:
基於索引的迭代器取值方式只適用於:列表、元組、字符串類型,而對於沒有索引的字典、集合、文件則不適用。
因此必須找到一種通用而且不依賴於索引的迭代器取值方式=》迭代器
可迭代的對象在python中但反內置有__iter__方法的對象,都是可迭代的對象
迭代器對象:指的是內置有__iter__方法,又內置有__next__的方法對象。
執行可迭代對象的__tier__方法獲得的就是內置的迭代器對象
執行迭代器對象的__next__獲得的是迭代器的下一個值
執行迭代器對象的__iter__獲得的任然是迭代器自己
#在平時中,須要先拿到可迭代對象:
info_iter=info__iter__()#加括號是變成迭代器對象
#再進行循環
while True:
try:#進行捕捉
print(info_iter.__next__())#括號運行迭代器
except stop Iteration#異常,總體進行迭代器將值運做完以後的異常捕捉
break
而for循環就是一個迭代器
在迭代對象中字符串,字典,列表,元組,集合以及文件,其中文件自己就是迭代器對象,而迭代器對象的__iter__仍是迭代器,只是爲了for循環統一標準。f=open("db.txt","r")f.__next__()執行一行文件內的內容也能夠寫爲next(f)須要強調的一點迭代器對象必定是可迭代對象,反之則否則優勢:提供一種通用的,能夠不依賴索引的迭代取值方式迭代器對象更加節省內存缺點:迭代器的取值不如按照索引的方式更靈活,由於他只能日後取不能往前退沒法預測迭代器值的個數(沒next取一個值)可迭代對象可一直進行迭代,迭代器只有第一次有,後面的爲無。