python?yield迭代器詳解
一、yield迭代器
在python深度學(xué)習(xí)模型讀取數(shù)據(jù)時(shí),經(jīng)常遇到y(tǒng)ield,互聯(lián)網(wǎng)搜索后,將比較容易理解的說明記錄一下。
二、使用步驟
1.引入庫
代碼如下(示例):
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的同胞兄弟來看,他們都在函數(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ì)象來提取結(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)文章
在Python中如何傳遞任意數(shù)量的實(shí)參的示例代碼
這篇文章主要介紹了在Python中如何傳遞任意數(shù)量的實(shí)參的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03python中import,from……import的使用詳解
這篇文章主要介紹了python中import,from……import的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02利用 Python ElementTree 生成 xml的實(shí)例
這篇文章主要介紹了利用 Python ElementTree 生成 xml的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03python 動(dòng)態(tài)獲取當(dāng)前運(yùn)行的類名和函數(shù)名的方法
這篇文章主要介紹了python 動(dòng)態(tài)獲取當(dāng)前運(yùn)行的類名和函數(shù)名的方法,分別介紹使用內(nèi)置方法、sys模塊、修飾器、inspect模塊等方法,需要的朋友可以參考下2014-04-04Python中多線程的創(chuàng)建及基本調(diào)用方法
由于注明的GIL的存在,Python盡管能創(chuàng)建多個(gè)線程,但是多線程卻不能同時(shí)工作...well,這里我們來看一下Python中多線程的創(chuàng)建及基本調(diào)用方法2016-07-07