首頁技術(shù)文章正文

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

更新時間:2017-12-07 來源:黑馬程序員 瀏覽量:

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

1. 迭代器

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

yield關(guān)鍵字

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

yield關(guān)鍵字

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

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

2. 生成器

生成器(generators)也是迭代器,但是我們只能對其迭代一次。這是因為生成器并沒有在內(nèi)存中存儲所有的值,而是要靠動態(tài)生成。

yield關(guān)鍵字

我們用圓括號()代替了方括號[],除此之外是相同的。但是,我們不能重復執(zhí)行for i in mygenerator,因為生成器只能使用一次:先計算出0,然后就忘了這個0并計算出1,最終計算出4。

3. yield

yield是一個關(guān)鍵字,使用起來類似return,但是使用的函數(shù)會返回一個生成器。

yield關(guān)鍵字

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

要掌握yield,我們必須理解當我們在調(diào)用函數(shù)的時候,我們在函數(shù)體中寫的代碼并沒有執(zhí)行。函數(shù)僅返回了一個生成器對象,這有點意想不到。

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

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

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

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

<

本文版權(quán)歸黑馬程序員人工智能+Python學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!


作者:黑馬程序員人工智能+Python培訓學院


首發(fā):http://python.itheima.com/


分享到:
在線咨詢 我要報名
和我們在線交談!