久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

第十三天 疊加多個(gè)裝飾器 迭代器 生成器

 印度阿三17 2018-09-28

今日內(nèi)容

今日內(nèi)容:

0. 疊加多個(gè)裝飾器:加載順序與執(zhí)行順序 @裝飾器1 @裝飾器2 @裝飾器3 #f1=裝飾器3(f1) def f1(): pass

?


? f1()

?

1. 迭代器(***)
2. 自定義迭代器的方式:生成器(***)
?
3. 三元表達(dá)式\列表生成式\生成器表達(dá)式\字典生成式(*****)
?
4. 函數(shù)的遞歸調(diào)用與二分法

一.迭代器

加載裝飾器就是將原函數(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')
while True:? ?try: ? ? ?print(iter_dic.__next__())? ?except StopIteration: ? ? ?break

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


? f1()
1. 迭代器(***)
2. 自定義迭代器的方式:生成器(***)
?
3. 三元表達(dá)式\列表生成式\生成器表達(dá)式\字典生成式(*****)
?
4. 函數(shù)的遞歸調(diào)用與二分法

一.迭代器

加載裝飾器就是將原函數(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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多