python?yield迭代器詳解
一、yield迭代器
在python深度學(xué)習(xí)模型讀取數(shù)據(jù)時(shí),經(jīng)常遇到y(tǒng)ield,互聯(lián)網(wǎng)搜索后,將比較容易理解的說(shuō)明記錄一下。
二、使用步驟
1.引入庫(kù)
代碼如下(示例):
def batch(data, batch_size): for ex in data: yield ex
2.讀入數(shù)據(jù)
代碼如下(示例):
p_batch = batch(p_batch, self.batch_size)
總結(jié)
如果不太好理解yield,可以先把yield當(dāng)作return的同胞兄弟來(lái)看,他們都在函數(shù)中使用,并履行著返回某種結(jié)果的職責(zé)。
這兩者的區(qū)別是:
有return的函數(shù)直接返回所有結(jié)果,程序終止不再運(yùn)行,并銷毀局部變量;
def batch(data, batch_size): for ex in data: return ex
而有yield的函數(shù)則返回一個(gè)可迭代的 generator(生成器)對(duì)象,你可以使用for循環(huán)或者調(diào)用next()方法遍歷生成器對(duì)象來(lái)提取結(jié)果。
什么是生成器呢?在 Python 中,使用了yield的函數(shù)被稱為生成器。有點(diǎn)套娃的感覺,但事實(shí)就是這樣,調(diào)用一個(gè)yield函數(shù),就會(huì)返回一個(gè)生成器對(duì)象。
def test: x=1 y=10 while x<y: yield x x+=1 t = test()
在調(diào)用生成器函數(shù)的過程中,每次遇到 yield 時(shí)函數(shù)會(huì)暫停并保存當(dāng)前所有的運(yùn)行信息(保留局部變量),返回yield的值, 并在下一次執(zhí)行next()方法時(shí)從當(dāng)前位置繼續(xù)運(yùn)行,直到生成器被全部遍歷完。
舉個(gè)例子
def test: x=1 yield x yield x+1 yield x+2 t = test() for tmp in t: print(tmp)
#輸出結(jié)果為:
1
2
3
也可以調(diào)用next方法:
next(t)
#輸出:
1
next(t)
#輸出:
2
next(t)
#輸出:
3
可以看到,test函數(shù)返回一個(gè)生成器,調(diào)用next()方法后,函數(shù)開始運(yùn)行,遇到第一個(gè)yield關(guān)鍵字,返回生成的值(1),程序暫停;
第二次調(diào)用next()方法,代碼從上次暫停的位置開始執(zhí)行,并遇到了第二個(gè)yield關(guān)鍵字,再返回生成的值(2),程序暫停;
第三次調(diào)用也是如此,返回生成的值(3),生成器耗盡,程序終止;
帶yield的函數(shù)是一個(gè)生成器,這個(gè)生成器有一個(gè)方法就是next,next就相當(dāng)于“下一步”生成哪個(gè)數(shù),這一次的next開始的地方是接著上一次的next停止的地方執(zhí)行的。
所以調(diào)用next的時(shí)候,生成器并不會(huì)從函數(shù)的開始執(zhí)行,只是接著上一步停止的地方開始,然后遇到y(tǒng)ield后,return出要生成的數(shù),此步就結(jié)束。
到此這篇關(guān)于python yield迭代器詳解的文章就介紹到這了,更多相關(guān)python yield 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Pandas中map, applymap and apply的區(qū)別
下面小編就為大家分享一篇淺談Pandas中map, applymap and apply的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-04-04
利用Python開發(fā)一個(gè)功能全面的Markdown編輯工具
這篇文章主要為大家詳細(xì)介紹了如何利用Python開發(fā)一個(gè)功能全面的Markdown編輯工具,支持Markdown內(nèi)容的編輯,HTML預(yù)覽等功能,需要的可以參考下2025-03-03
Flask-SocketIO服務(wù)端安裝及使用代碼示例
這篇文章主要介紹了Flask-SocketIO服務(wù)端安裝及使用代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
matplotlib繪制符合論文要求的圖片實(shí)例(必看篇)
下面小編就為大家?guī)?lái)一篇matplotlib繪制符合論文要求的圖片實(shí)例(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-06-06
Pandas之StyleFrame如何設(shè)置表格樣式
這篇文章主要介紹了Pandas之StyleFrame如何設(shè)置表格樣式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

