如何掌握Python生成器

本篇內(nèi)容介紹了“如何掌握Python生成器”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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

1. 什么是可迭代對(duì)象?

可迭代對(duì)象,英文Iterable,是一個(gè)形容詞,這類(lèi)對(duì)象和Java語(yǔ)言類(lèi)似,都可看作是一類(lèi)接口,抽象地描述事物具備怎樣的能力。所以,Iterable自然具備可迭代能力。

如下,常見(jiàn)的list,Iterator等都是Iterable對(duì)象:

In [33]: from collections.abc import Iterable,Iterator                        In [34]: issubclass(list,Iterable)                                           Out[34]: True  In [35]: issubclass(Iterator,Iterable)

2. 什么是一個(gè)生成器?

生成器是可迭代的(Iterable),最簡(jiǎn)單的創(chuàng)建生成器方法是通過(guò)一對(duì)(),如下所示:

In [37]: g = (i*i for i in [1,4,0])                                           In [38]: g                                                                   Out[38]: <generator object <genexpr> at 0x7fe8956e96d0>

g 是一個(gè)生成器對(duì)象,generator object

獲取生成器對(duì)象的元素,可使用next函數(shù),如下所示,獲取第一個(gè)元素:

In [39]: next(g)                                                             Out[39]: 1

獲取第二個(gè)元素:

In [40]: next(g)                                                             Out[40]: 16

3. 創(chuàng)建生成器的幾種方法?

如上所見(jiàn),使用一對(duì)()能夠創(chuàng)建一個(gè)生成器對(duì)象。

除此之外,想必大家也都知道,是使用關(guān)鍵字 yield. yield出現(xiàn)在一個(gè)函數(shù)中,運(yùn)行到y(tǒng)ield處,返回的對(duì)象便是生成器對(duì)象(generator  object).

4. 生成器是迭代器嗎?

生成器對(duì)象(generator object)一定也是迭代器對(duì)象(Iterator  object),如上面的生成器g,使用內(nèi)置函數(shù)isinstance驗(yàn)證,返回True:

In [43]: isinstance(g,Iterator)                                              Out[43]: True

因此,它具備一切迭代器的特性,關(guān)于迭代器我們已在上一個(gè)話題討論,簡(jiǎn)而言之,迭代器的幾個(gè)特點(diǎn):

  • 是有去無(wú)回的,

  • 迭代器無(wú)需提前知道整個(gè)列表的所有元素,

  • 無(wú)需加載所有元素到RAM中盡而它是節(jié)省內(nèi)存的(memory-efficient).

生成器同樣具備這些特性。除此之外,它還有一些獨(dú)有的特性,下面跟隨yield 我們便能看出來(lái)。

5. 如何用一句話描述 yield?

如何掌握Python生成器

yield 關(guān)鍵字的用法在stackoverflow上也是最熱的問(wèn)題之一,借用一個(gè)最熱回答中的解釋?zhuān)?/p>

 yield is a keyword that is used like return, except the function will return  a generator.

yield 是一個(gè)特殊的return, 它返回一個(gè)生成器對(duì)象。

說(shuō)實(shí)話,理解這些只是皮毛。那么,如何精通yield的用法呢?

6. 如何精通yield的用法?

要想精通yield,你必須首先搞清楚一點(diǎn):

當(dāng)你調(diào)用帶有yield的函數(shù)時(shí),函數(shù)并沒(méi)有執(zhí)行任何一行,只是返回一個(gè)生成器對(duì)象

為了幫助大家理解,創(chuàng)建一個(gè)帶有yield的函數(shù):

def gfun():     mylist = range(3)     for i in mylist:         yield i*i  g = gfun() print(g)

為了加深印象,你可以自己調(diào)試驗(yàn)證一遍,函數(shù)第一行打的斷點(diǎn)始終未被命中。

帶yield的函數(shù)和for結(jié)合使用,第一次調(diào)用上一步創(chuàng)建的生成器對(duì)象后,將會(huì)進(jìn)入函數(shù)體直到遇到y(tǒng)ield返回值。

然后,for循環(huán)再進(jìn)入函數(shù)時(shí),直接跑到y(tǒng)ield的下一句。直到生成器對(duì)象變空為止。

使用下面代碼演示yield的上面過(guò)程:

def createGenerator():     mylist = range(3)     for i in mylist:         yield i*i         print(i*i)  g = createGenerator() print(g) for gi  in g:     pass

參考錄制的gif:

如何掌握Python生成器

7. yield 都有哪些重要價(jià)值?

Python引入yield后,便擁有具備實(shí)現(xiàn)協(xié)程的能力,協(xié)程的確是一種高效的編程模型,關(guān)于協(xié)程的理解,后面專(zhuān)題會(huì)詳細(xì)討論。包括更高級(jí)的功能如異步等,根基都是yield.

8. yield 和 itertools

yield重要性和使用廣泛性還提現(xiàn)在,Python單獨(dú)一個(gè)模塊專(zhuān)門(mén)用于管理迭代器和生成器對(duì)象,便是itertools,里面封裝的方法特性后面再討論。

9. yield 使用案例

yield實(shí)現(xiàn)浮點(diǎn)數(shù)步長(zhǎng)的frange:

def frange(start,end,step):     i = start     while i<end:         yield round(i,3)         i+=step

調(diào)用frange:

for item in frange(10,14,0.8):     print(item)

結(jié)果:

10 10.8 11.6 12.4 13.2

“如何掌握Python生成器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

分享名稱(chēng):如何掌握Python生成器
標(biāo)題路徑:http://muchs.cn/article10/pjjcdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站收錄、軟件開(kāi)發(fā)、服務(wù)器托管、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

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

網(wǎng)站優(yōu)化排名