今日內(nèi)容 今日內(nèi)容:0. 疊加多個(gè)裝飾器:加載順序與執(zhí)行順序 @裝飾器1 @裝飾器2 @裝飾器3 #f1=裝飾器3(f1) def f1(): pass ?
? 1. 迭代器(***) 一.迭代器加載裝飾器就是將原函數(shù)名偷梁換柱成裝飾器最內(nèi)層那個(gè)warpper函數(shù) 在加載完畢后,調(diào)用原函數(shù)其實(shí)就是在調(diào)用warpper函數(shù) ? 當(dāng)一個(gè)唄裝飾的對(duì)象同時(shí)疊加多個(gè)裝飾器時(shí) 裝飾器的加載順序是:自下而上 裝飾器內(nèi)wrapper函數(shù)的執(zhí)行順序是:自上而下 ? import time def timmer(func):#func=wrapper2的內(nèi)容地址 def wrapperl(*args,**kwargs): print('=====>wrapper:1運(yùn)行了') start=time.time() res=func(*args,**kwargs) stop=time.time() print('run time is %s'%(stop-start)) return res return wrappoer1 ? def auth(engine='file'): def xxx(func): # func = 最原始那個(gè)index的內(nèi)存 def wrapper2(*args,**kwargs): print('===========>wrapper2運(yùn)行了') name=input('username>>>:').strip() pwd=input('password>>:').strip() if engine=='file': print('基與文件的認(rèn)證') if engine=='egon' and pwd =='123': print('login sunccessfull') res = func(*args,**kwargs) return res elif engine =='mysql': print('基于mysql的認(rèn)證') elif engine =='ldap': print('基于ldap的認(rèn)證') else: print('錯(cuò)誤的認(rèn)證源') return wrapper2 return xxx @timmer #iindex=timmer(wrapper2的內(nèi)存地址) #index=wrapper1的內(nèi)存地址 @auth(engine='file') #@xxx #index=xxx(最原始那個(gè)index的內(nèi)存地址) #index=wrapper的內(nèi)存地址 def index(): print('welcom to index page') time.sleep(2) ? index() #wrapper1的內(nèi)存地址() ? 二 迭代器 1.什么是迭代器\ 迭代指的時(shí)一個(gè)重復(fù)的過(guò)程,每一次重復(fù)都是基于上一次的結(jié)果而來(lái)的 li=['a','b','c','d','e'] li=('a','b','c','d','e') li='hello' ? i=0 while i < len(li): print(li[li]) i =1 迭代器指的是迭代取值的工具,該工具的特點(diǎn)是可以付依賴索引取值 2.為何要用迭代器 為了找出一種通用的&可以不依賴于索引的迭代取值方式 3.如何用迭代器 可迭代的對(duì)象:但凡內(nèi)置有.__iter__方法的對(duì)象都稱之為可迭代的對(duì)象 迭代器對(duì)象:既內(nèi)置有__iter__方法,又內(nèi)置有__next__方法 關(guān)于__iter__方法: 調(diào)用可迭代對(duì)象的__iter__會(huì)得到一個(gè)迭代器對(duì)象 調(diào)用迭代器對(duì)象的__iter__會(huì)得到迭代器本身 4.總結(jié)迭代器的優(yōu)缺點(diǎn) 優(yōu)點(diǎn): 1.提供了一種通用的&可以不依賴于索引的迭代器取值方式 2.同一時(shí)刻在內(nèi)存中只有一個(gè)值,更加節(jié)約內(nèi)存 缺點(diǎn) 1.取值定值不如索引靈活,并且迭代器是一次性的 2.無(wú)法預(yù)知迭代器數(shù)據(jù)的個(gè)數(shù) ? 可迭代的對(duì)象:str,list,tuple,dict,set,文件對(duì)象 迭代器對(duì)象:文件對(duì)象 可迭代對(duì)象===>迭代器對(duì)象:調(diào)用可迭代對(duì)象內(nèi)置的__iter__方法會(huì)有一個(gè)返回值,該返回值就是 對(duì)應(yīng)的迭代器對(duì)象 dic={'x':1,'y':2,'z':3} iter_dic=dic.__iter__() res1=iter_dic.__next__() print(res1) ? res2=iter_dic.__next__() print(res2) ? res3=iter_dic.__next__() print(res3) ? res4=iter_dic.__next__() print(res4) ? print(dic.__iter__().__next__()) print(dic.__iter__().__next__()) print(dic.__iter__().__next__()) ? ? iter_dic=open(r'D:\上海python全棧4期\day13\今日內(nèi)容',mode='rt',encoding='utf-8') for準(zhǔn)確地說(shuō)應(yīng)該是迭代器循環(huán),for循環(huán)的原理如下: 1.先調(diào)用in后面那個(gè)值得__iter__方法,得到迭代器對(duì)象 2.執(zhí)行迭代器.__next__()方法得到一個(gè)返回值,然后復(fù)制給一個(gè)變量k,運(yùn)行循環(huán)體代碼 3.循環(huán)往復(fù),直到迭代器取值完畢拋出異常然后捕捉異常自動(dòng)結(jié)束循環(huán) dic={'x':1,'y':2,'z':3} iter_dic=dic.__iter__() print(iter_dic) print(iter_dic._iter_()) ? for k in dic:#iter_dic=dic.__iter__() print(k) with open(r'D:\上海python全棧4期\day13\今日內(nèi)容',mode='rt',encoding='utf-8') as f: for line in f: #iter_f=f.__iter__() print(line) 三.自定義迭代器 yield關(guān)鍵字:只用在函數(shù)內(nèi) 在函數(shù)內(nèi)但凡包含有yield關(guān)鍵字,再去執(zhí)行函數(shù),就不會(huì)立即運(yùn)行函數(shù)整體代碼了 會(huì)得到一個(gè)返回值,該返回值稱之為生成器對(duì)象,生成器的本質(zhì)就是迭代器 ? 總結(jié)yield: 1. 提供一種自定義hi迭代器的解決方案 2. yield可用于返回值 yield VS return 相同點(diǎn):都可以用于返回值 不同點(diǎn):yield可以暫停函數(shù),yield可以返回多次值,而return只能返回值一次值函數(shù)就立刻理終止 def func(): print('=====>第一次') yield 1 print('=====>第二次') yield 2 print('=====>第三次') yield print('=====>第四次') ? def my_range(start,stop,step=1): while start < stop: yield start start =step res=my_range(1,5,2) # 1 3 next(res) next(res) # print(next(res)) # for item in res: # print(item) for item in my_range(1,5,2): print(item) ? 三元表達(dá)式 def max2(x,y): if x > y: return x else: return y x=10 y=20 res='條件成立的值' if x>y else '條件不成立的值' print(er) 列表生成式 l=[ ] for i in range (1,11): if i>4: res='egg%'%i l.append(res) print(l) l=['egg%s'%i for i in range (1,11) if i>4] l=[ ] for name in names: if name !=-'egon': res='%s_DSB'%name l.append(res) print(l) l=['%s_DSB' %name for name in names if name !='egon'] print(l) ? 生成器表達(dá)式 res(i**2 for i in range(3)) print(res) print(next(res)) print(next(res)) print(next(res)) print(next(res)) ? with open(r'D:\上海python全棧4期\day13\今日內(nèi)容',mode='rt',encoding='utf-8') as f: data=f.read() print(len(data)) #1025 res=0 for line in f: res =len(line) print(res) res=sum((len(line) for line in f)) res=sum(len(line) for line in f) print(res) res=max([len(line) for line in f]) res=max((len(line) for line in f)) res=max(len(line) for line in f) print(res) 字典生成式 items=[('name','egon'),('age',18),('sex','male')] dic={} for k,v in items: dic[k]=v print(dic) res={k:v for k,v in items if k != 'sex'} print(res) res={i for i in 'hello'} print(res)
? ? 今日內(nèi)容 今日內(nèi)容:0. 疊加多個(gè)裝飾器:加載順序與執(zhí)行順序 @裝飾器1 @裝飾器2 @裝飾器3 #f1=裝飾器3(f1) def f1(): pass
1. 迭代器(***) 一.迭代器加載裝飾器就是將原函數(shù)名偷梁換柱成裝飾器最內(nèi)層那個(gè)warpper函數(shù) 在加載完畢后,調(diào)用原函數(shù)其實(shí)就是在調(diào)用warpper函數(shù) ? 當(dāng)一個(gè)唄裝飾的對(duì)象同時(shí)疊加多個(gè)裝飾器時(shí) 裝飾器的加載順序是:自下而上 裝飾器內(nèi)wrapper函數(shù)的執(zhí)行順序是:自上而下 ? import time def timmer(func):#func=wrapper2的內(nèi)容地址 def wrapperl(*args,**kwargs): print('=====>wrapper:1運(yùn)行了') start=time.time() res=func(*args,**kwargs) stop=time.time() print('run time is %s'%(stop-start)) return res return wrappoer1 ? def auth(engine='file'): def xxx(func): # func = 最原始那個(gè)index的內(nèi)存 def wrapper2(*args,**kwargs): print('===========>wrapper2運(yùn)行了') name=input('username>>>:').strip() pwd=input('password>>:').strip() if engine=='file': print('基與文件的認(rèn)證') if engine=='egon' and pwd =='123': print('login sunccessfull') res = func(*args,**kwargs) return res elif engine =='mysql': print('基于mysql的認(rèn)證') elif engine =='ldap': print('基于ldap的認(rèn)證') else: print('錯(cuò)誤的認(rèn)證源') return wrapper2 return xxx @timmer #iindex=timmer(wrapper2的內(nèi)存地址) #index=wrapper1的內(nèi)存地址 @auth(engine='file') #@xxx #index=xxx(最原始那個(gè)index的內(nèi)存地址) #index=wrapper的內(nèi)存地址 def index(): print('welcom to index page') time.sleep(2) ? index() #wrapper1的內(nèi)存地址() ? 二 迭代器 1.什么是迭代器\ 迭代指的時(shí)一個(gè)重復(fù)的過(guò)程,每一次重復(fù)都是基于上一次的結(jié)果而來(lái)的 li=['a','b','c','d','e'] li=('a','b','c','d','e') li='hello' ? i=0 while i < len(li): print(li[li]) i =1 迭代器指的是迭代取值的工具,該工具的特點(diǎn)是可以付依賴索引取值 2.為何要用迭代器 為了找出一種通用的&可以不依賴于索引的迭代取值方式 3.如何用迭代器 可迭代的對(duì)象:但凡內(nèi)置有. 來(lái)源:http://www./content-4-28511.html |
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》