python中的生成器是什么-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線(xiàn)動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的河源網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

python中的生成器是什么?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

生成器,是一個(gè)用來(lái)創(chuàng)建迭代器的工具。它簡(jiǎn)單而強(qiáng)大,類(lèi)似寫(xiě)函數(shù)那樣進(jìn)行定義,但是需要返回?cái)?shù)據(jù)時(shí)不是使用return,而是使用yield語(yǔ)句。

生成器函數(shù)

用yield語(yǔ)句返回?cái)?shù)據(jù)的“函數(shù)”,稱(chēng)為生成器函數(shù)。我們把上一節(jié)中自定義類(lèi)LessThan改寫(xiě)成生成器函數(shù)

In [30]: def lessthan(n): 
    ...:     for i in range(n-1, -1, -1): 
    ...:         yield i 
    ...:          
    ...:

In [31]: for i in lessthan(5): 
    ...:     print(i) 
    ...:
4
3
2
1
0
In [32]: lt = lessthan(3)

## 查看生成器對(duì)象的__iter__()和__next__():
In [33]: lt.__iter__?
Signature:      lt.__iter__()
Call signature: lt.__iter__(*args, **kwargs)
Type:           method-wrapper
String form:    <method-wrapper '__iter__' of generator object at 0x7fc048cb8ba0>
Docstring:      Implement iter(self).

In [34]: lt.__next__?
Signature:      lt.__next__()
Call signature: lt.__next__(*args, **kwargs)
Type:           method-wrapper
String form:    <method-wrapper '__next__' of generator object at 0x7fc048cb8ba0>
Docstring:      Implement next(self).

通過(guò)生成器改寫(xiě)LessThan類(lèi)后,代碼更加簡(jiǎn)潔緊湊,因?yàn)樗詣?dòng)創(chuàng)建了__iter__()和__next__()方法,通過(guò)for循環(huán)可以遍歷生成器對(duì)象。

接下來(lái)我們定義一個(gè)生成器對(duì)象lt,對(duì)這個(gè)生成器對(duì)象調(diào)用next(),每一次調(diào)用它都會(huì)從上次離開(kāi)的位置回復(fù)執(zhí)行(也就是記住上次執(zhí)行語(yǔ)句時(shí)的所有數(shù)據(jù)值)。當(dāng)生成器生成了所有元素(生成器終結(jié))就會(huì)引發(fā)StopIteration錯(cuò)誤。

In [53]: lt = lessthan(3)

In [54]: next(lt)
Out[54]: 2

In [55]: next(lt)
Out[55]: 1

In [56]: next(lt)
Out[56]: 0

In [57]: next(lt)
---------------------------------------------------
StopIteration      Traceback (most recent call last)
<ipython-input-37-00f31299a3f9> in <module>
----> 1 next(lt)

StopIteration:

生成器解析式

為了實(shí)現(xiàn)一些簡(jiǎn)單的生成器,我們可以不用函數(shù)的形式,而是用類(lèi)似列表解析式的語(yǔ)法,將外層的方括號(hào)用圓括號(hào)代替即可。

生成器表達(dá)式相比完整的生成器更緊湊但較不靈活,相比等效的列表推導(dǎo)式則更為節(jié)省內(nèi)存。比如下面的的代碼,用列表表達(dá)式生成的mylist的每個(gè)元素都保存在內(nèi)存中,而mygener每次迭代時(shí)才會(huì)產(chǎn)生一個(gè)元素。假設(shè)元素個(gè)數(shù)不是10,而是100萬(wàn)甚至更多,此時(shí)生成器的內(nèi)存優(yōu)勢(shì)會(huì)非常明顯。

In [41]: mylist = [i*i for i in range(10)]

In [42]: mylist
Out[42]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

In [43]: mygener = (i*i for i in range(10))

In [44]: mygener
Out[44]: <generator object <genexpr> at 0x7fc048be3bf8>

生成器解析式被設(shè)計(jì)用于生成器將立即被外層函數(shù)所使用的情況,比如:

In [45]: sum(i*i for i in range(10))
Out[45]: 285

sum()括號(hào)里面的i*i for i in range(10)就是一個(gè)生成器解析式,避免生成一個(gè)列表而占用過(guò)多內(nèi)存。

同樣的,下面的例子中都是使用了生成器解析式:

xvec = [10, 20, 30]
yvec = [7, 5, 3]
sum(x*y for x,y in zip(xvec, yvec))         # dot product

from math import pi, sin
sine_table = {x: sin(x*pi/180) for x in range(0, 91)}

unique_words = set(word  for line in page  for word in line.split())

valedictorian = max((student.gpa, student.name) for student in graduates)

data = 'golf'
list(data[i] for i in range(len(data)-1, -1, -1))

總結(jié)

Python提供了兩種方式實(shí)現(xiàn)生成器:

(1)生成器函數(shù)

語(yǔ)法上與普通函數(shù)相似,用yield替代return換回值;自動(dòng)實(shí)現(xiàn)迭代器協(xié)議:__iter__()方法和__next__()方法。沒(méi)有值可返回時(shí),引起StopInteration異常。yield語(yǔ)句掛起生成器函數(shù)的狀態(tài),以便再次迭代時(shí)從離開(kāi)的狀態(tài)繼續(xù)執(zhí)行。

(2)生成器解析式

類(lèi)似列表解析式,用圓括號(hào)替換方括號(hào),從而簡(jiǎn)單實(shí)現(xiàn)簡(jiǎn)單的生成器。

(3)生成器的優(yōu)點(diǎn)

代碼緊湊,節(jié)省內(nèi)存。不像列表可以多次遍歷,生成器只能遍歷一遍。

看完上述內(nèi)容,你們掌握python中的生成器是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁(yè)名稱(chēng):python中的生成器是什么-創(chuàng)新互聯(lián)
文章位置:http://muchs.cn/article34/ddhgse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、App設(shè)計(jì)、Google、動(dòng)態(tài)網(wǎng)站、定制開(kāi)發(fā)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)