教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Python中的yield關(guān)鍵字做了什么?

更新時(shí)間:2018年01月10日13時(shí)42分 來(lái)源:傳智播客 瀏覽次數(shù):

Python中的yield關(guān)鍵字做了什么

要理解yield做了什么,就必須明白生成器(generators)為何物,而在明白生成器之前還要知道迭代器(iterables)。

1.迭代器

當(dāng)我們創(chuàng)建一個(gè)list的時(shí)候,我們可以一個(gè)接一個(gè)的讀取它的成員。這種一個(gè)接一個(gè)讀取的行為叫做迭代:

>>>mylist = [1, 2, 3]

>>>for i in mylist:

... print(i)

1

2

3

mylist就是一個(gè)迭代器。當(dāng)我們使用列表推導(dǎo)式(亦稱列表生成式,list comprehension)時(shí),我們創(chuàng)建了一個(gè)list,同時(shí)還有一個(gè)迭代器:

>>>mylist = [x*x for x in range(3)]

>>>for i in mylist:

... print(i)

0

1

4

我們可以使用“ for … in …”的任何事物都是迭代器,如:列表、字符串、文件等。

這些迭代器很便利,我們可以想讀取多少就讀取多少,但是我們要在內(nèi)存中儲(chǔ)存所有的可取值,然而當(dāng)我們有太多的值時(shí)我們不總是希望如此。

2.生成器

生成器(generators)也是迭代器,但是我們只能對(duì)其迭代一次。這是因?yàn)樯善鞑](méi)有在內(nèi)存中存儲(chǔ)所有的值,而是要靠動(dòng)態(tài)生成。

>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:... print(i)014

我們用圓括號(hào)()代替了方括號(hào)[],除此之外是相同的。但是,我們不能重復(fù)執(zhí)行for i in mygenerator,因?yàn)樯善髦荒苁褂靡淮危合扔?jì)算出0,然后就忘了這個(gè)0并計(jì)算出1,最終計(jì)算出4。

3.yieldyield是一個(gè)關(guān)鍵字,使用起來(lái)類似return,但是使用的函數(shù)會(huì)返回一個(gè)生成器。

>>> def createGenerator():... mylist = range(3)... for i in mylist:... yield i*i...>>> mygenerator = createGenerator() # 創(chuàng)建一個(gè)生成器>>> print(mygenerator) # mygenerator是一個(gè)對(duì)象!>>> for i in mygenerator:... print(i)014

這是一個(gè)沒(méi)用的例子,但是當(dāng)我們知道我們的函數(shù)要返回一個(gè)龐大的值集合,而這些值我們只會(huì)迭代讀取一次時(shí),這樣使用是很方便的。

要掌握yield,我們必須理解當(dāng)我們?cè)谡{(diào)用函數(shù)的時(shí)候,我們?cè)诤瘮?shù)體中寫(xiě)的代碼并沒(méi)有執(zhí)行。函數(shù)僅返回了一個(gè)生成器對(duì)象,這有點(diǎn)意想不到。

然后,當(dāng)for每次使用生成器的時(shí)候,我們的代碼都會(huì)被執(zhí)行一次。

重要的細(xì)節(jié)部分:

第一次for調(diào)用由我們的函數(shù)創(chuàng)建的生成器時(shí),會(huì)從頭執(zhí)行我們函數(shù)中的代碼直到遇見(jiàn)yield關(guān)鍵字,然后會(huì)返回循環(huán)的第一個(gè)值。其后每次調(diào)用都會(huì)再一次運(yùn)行我們?cè)诤瘮?shù)中寫(xiě)的循環(huán),返回下一個(gè)值,以此一直到再?zèng)]有返回值。

一旦函數(shù)運(yùn)行但不再激發(fā)yield時(shí),就可以認(rèn)為生成器已經(jīng)空了。這可能是由于循環(huán)已經(jīng)結(jié)束,或者由于我們不再滿足“if/else”的條件判斷。

本文版權(quán)歸傳智播客人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客人工智能+Python學(xué)院
0 分享到:
和我們?cè)诰€交談!