python?yield迭代器詳解
一、yield迭代器
在python深度學習模型讀取數(shù)據(jù)時,經(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)
總結
如果不太好理解yield,可以先把yield當作return的同胞兄弟來看,他們都在函數(shù)中使用,并履行著返回某種結果的職責。
這兩者的區(qū)別是:
有return的函數(shù)直接返回所有結果,程序終止不再運行,并銷毀局部變量;
def batch(data, batch_size): for ex in data: return ex
而有yield的函數(shù)則返回一個可迭代的 generator(生成器)對象,你可以使用for循環(huán)或者調用next()方法遍歷生成器對象來提取結果。
什么是生成器呢?在 Python 中,使用了yield的函數(shù)被稱為生成器。有點套娃的感覺,但事實就是這樣,調用一個yield函數(shù),就會返回一個生成器對象。
def test: x=1 y=10 while x<y: yield x x+=1 t = test()
在調用生成器函數(shù)的過程中,每次遇到 yield 時函數(shù)會暫停并保存當前所有的運行信息(保留局部變量),返回yield的值, 并在下一次執(zhí)行next()方法時從當前位置繼續(xù)運行,直到生成器被全部遍歷完。
舉個例子
def test: x=1 yield x yield x+1 yield x+2 t = test() for tmp in t: print(tmp)
#輸出結果為:
1
2
3
也可以調用next方法:
next(t)
#輸出:
1
next(t)
#輸出:
2
next(t)
#輸出:
3
可以看到,test函數(shù)返回一個生成器,調用next()方法后,函數(shù)開始運行,遇到第一個yield關鍵字,返回生成的值(1),程序暫停;
第二次調用next()方法,代碼從上次暫停的位置開始執(zhí)行,并遇到了第二個yield關鍵字,再返回生成的值(2),程序暫停;
第三次調用也是如此,返回生成的值(3),生成器耗盡,程序終止;
帶yield的函數(shù)是一個生成器,這個生成器有一個方法就是next,next就相當于“下一步”生成哪個數(shù),這一次的next開始的地方是接著上一次的next停止的地方執(zhí)行的。
所以調用next的時候,生成器并不會從函數(shù)的開始執(zhí)行,只是接著上一步停止的地方開始,然后遇到y(tǒng)ield后,return出要生成的數(shù),此步就結束。
到此這篇關于python yield迭代器詳解的文章就介紹到這了,更多相關python yield 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中import,from……import的使用詳解
這篇文章主要介紹了python中import,from……import的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02利用 Python ElementTree 生成 xml的實例
這篇文章主要介紹了利用 Python ElementTree 生成 xml的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03python 動態(tài)獲取當前運行的類名和函數(shù)名的方法
這篇文章主要介紹了python 動態(tài)獲取當前運行的類名和函數(shù)名的方法,分別介紹使用內置方法、sys模塊、修飾器、inspect模塊等方法,需要的朋友可以參考下2014-04-04