真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

迭代器/生成器/裝飾器-創(chuàng)新互聯(lián)

迭代器

成都創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元洛隆做網(wǎng)站,已為上家服務(wù),為洛隆各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

迭代器對(duì)象要求支持迭代器協(xié)議的對(duì)象,在Python中,支持迭代器協(xié)議就是實(shí)現(xiàn)對(duì)象的__iter__()和next()方法。其中__iter__()方法返回迭代器對(duì)象本身;next()方法返回容器的下一個(gè)元素,在結(jié)尾時(shí)引發(fā)StopIteration異常

可迭代對(duì)象

如果給定一個(gè)list或tuple,我們可以通過for循環(huán)來遍歷這個(gè)list或tuple,這種遍歷我們稱為迭代(Iteration),默認(rèn)的list、tuple、stri、dict對(duì)象都是可以迭代的。

isinstance(object, classinfo) 方法說明

如果參數(shù)object是classinfo的實(shí)例,或者object是classinfo類的子類的一個(gè)實(shí)例, 返回True。如果object不是一個(gè)給定類型的的對(duì)象, 則返回結(jié)果總是False。

如何判斷對(duì)象是否為可迭代對(duì)象?

>>> from collections import Iterable

>>> isinstance('abc',Iterable)

True

>>> isinstance([1,2],Iterable)

True

>>> isinstance(123,Iterable)

False

>>> isinstance({'k1':'v1'},Iterable)

True

列表生成式

用來創(chuàng)建list的生成式

如果要生成[1*1,2*2,3*3,4*4…..10*10]這樣的列表該怎么做呢?

傳統(tǒng)做法:

list1 = []

for i in range(1,11):

   list1.append(i*i)

print(list1)

使用列表生成式:

list2 = [i*i for i in range(1,11)]

print(list2)

運(yùn)用列表生成式,可以快速生成list,可以通過一個(gè)list推導(dǎo)出另一個(gè)list,而代碼卻十分簡潔。

生成器(generator)

如果我們需要一個(gè)非常多元素的列表,但是我們只需要訪問前面的幾個(gè)元素,如果使用傳統(tǒng)的方法,一次創(chuàng)建完該列表將會(huì)占用很大的存儲(chǔ)空間,這時(shí)候,我們就需要一種一邊使用,一邊生成元素的機(jī)制,這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器(Generator)。

創(chuàng)建生成器

第一種簡單辦法,將列表生成式的[]改為()

>>> list2 = (i*i for i in range(1,11))

>>> print(list2,type(list2))

at 0x000001F4A35AD678>

第二種辦法:使用yield

如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator

生成斐波拉契數(shù)列:

def fib(max):

   n, a, b = 0, 0, 1

   while n < max:

       # print(b)

       yield b

       a, b = b, a + b

       n = n + 1

   return 'done'

a = fib(20)

print(next(a))

print(next(a))

使用yield后,生成器的執(zhí)行流程:

函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行

generator是非常強(qiáng)大的工具,在Python中,可以簡單地把列表生成式改成generator,也可以通過函數(shù)實(shí)現(xiàn)復(fù)雜邏輯的generator。

要理解generator的工作原理,它是在for循環(huán)的過程中不斷計(jì)算出下一個(gè)元素,并在適當(dāng)?shù)臈l件結(jié)束for循環(huán)。對(duì)于函數(shù)改成的generator來說,遇到return語句或者執(zhí)行到函數(shù)體最后一行語句,就是結(jié)束generator的指令,for循環(huán)隨之結(jié)束。

生成器和普通函數(shù)調(diào)用返回結(jié)果的區(qū)別?

普通函數(shù)調(diào)用直接返回結(jié)果

生成器調(diào)用實(shí)際返回的是一個(gè)generator對(duì)象

裝飾器

為已經(jīng)實(shí)現(xiàn)的功能增加新功能,在不改變源碼已經(jīng)調(diào)用方式的情況下動(dòng)態(tài)增加功能的方式,稱之為裝飾器(Decorator)

#!/usr/bin/envpython

#-*-coding:utf-8-*-

#裝飾器簡單實(shí)現(xiàn)

#原始版本,不帶驗(yàn)證

defweb():

print('webdata.')

web()

#版本一,帶驗(yàn)證

#問題:當(dāng)我不執(zhí)行web(),只執(zhí)行賦值的時(shí)候就會(huì)出現(xiàn)authpass.顯然是不對(duì)的

defauth(func):

print('authpass.')

returnfunc

defweb():

print('webdata.')

web=auth(web)

web()

#版本二,待驗(yàn)證,并且解決上面的調(diào)用問題,使用@調(diào)用裝飾器

defauth(func):

definner():

print('authpass.')

func()

returninner

@auth

defweb():

print('webdata.')

web()

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


網(wǎng)站標(biāo)題:迭代器/生成器/裝飾器-創(chuàng)新互聯(lián)
文章分享:http://weahome.cn/article/cddjsi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部