Python生成器的使用方法和示例代碼
本文是《Effect Python 編寫高質(zhì)量Python代碼的59個(gè)有效方法》的學(xué)習(xí)筆記。主要記錄生成器的使用方法和示例代碼。
返回隊(duì)列的函數(shù)
如果函數(shù)要產(chǎn)生一系列結(jié)果,那么最簡單的做法就是把這些結(jié)構(gòu)都放在一份列表里,然后將其返回給調(diào)用者。
def index_words(text): """用append方法將這些此的首字母索引添加到result列表中,并在函數(shù)結(jié)束時(shí)將其返回給調(diào)用者。""" result = [] if text: result.append(0) for index, letter in enumerate(text): if letter == ' ': result.append(index+1) return result
輸入一些測試值,驗(yàn)證該函數(shù)能正常運(yùn)行:
>address = 'Four score and seven years ago...' result = index_words(address) print(result[:3])
打印
[0, 5, 11]
生成器函數(shù)
這個(gè)函數(shù)改用生成器(generator)來寫會(huì)更好。生成器是使用yield
表達(dá)式的函數(shù)。調(diào)用生成器函數(shù)時(shí),它并不會(huì)真的運(yùn)行,而是會(huì)返回迭代器。每次在這個(gè)迭代器上面調(diào)用內(nèi)置的next
函數(shù)時(shí),迭代器會(huì)把生成器推進(jìn)到下一個(gè)yield
表達(dá)式那里。生成器傳給yield
的每一個(gè)值,都會(huì)由迭代器返回給調(diào)用者。
def index_words_iter(text): if text: yield 0 for index, letter in enumerate(text): if letter == ' ': yield index + 1
result = list(index_words_iter(address))
注意:生成器函數(shù)返回的迭代器是有狀態(tài)的,調(diào)用者不應(yīng)該反復(fù)使用。
由于迭代器只能產(chǎn)生一輪結(jié)果。在拋出過StopIteration異常的迭代器或生成器上面繼續(xù)迭代第二輪,是不會(huì)有結(jié)果的。為解決此問題,我們可以明確地使用該迭代器制作一份列表,將它的全部內(nèi)容都遍歷一次,并賦值到這份列表里,然后就可以在復(fù)制出來的數(shù)據(jù)列表上面多次迭代了。
為類實(shí)現(xiàn)生成器
下面是一個(gè)可以迭代的容器類,用來從文件中讀取每行數(shù)據(jù)。
class ReadFileLines(object): """ 可以迭代的容器類,從文件中獲取數(shù)據(jù) """ def __init__(self, path): self.path = path def __iter__(self): with open(self.path) as f: for line in f: yield line
多次迭代
如果想多次迭代生成器的數(shù)據(jù),可以使用下面的函數(shù)。該函數(shù)會(huì)逐步拷貝生成器的所有數(shù)據(jù),然后返回一個(gè)隊(duì)列數(shù)據(jù)。
def normalize_defensive(datas): """ 從生成器返回一份可以多次迭代的數(shù)據(jù) :param datas:容器 :return: result:隊(duì)列(list) """ # 確保調(diào)用者傳進(jìn)來的參數(shù),并不是迭代器對(duì)象本身 if iter(datas) is iter(datas): raise TypeError('Must supply a container') # TODO result = [] for data in datas: # TODO result.append(data) return result
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Python動(dòng)態(tài)導(dǎo)入模塊的方法實(shí)例分析
這篇文章主要介紹了Python動(dòng)態(tài)導(dǎo)入模塊的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python動(dòng)態(tài)導(dǎo)入系統(tǒng)模塊、自定義模塊以及模塊列表的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06python實(shí)點(diǎn)云分割k-means(sklearn)詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)點(diǎn)云分割k-means,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05JavaScript實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組
下面小編就為大家分享一篇JavaScript實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04深入理解Python虛擬機(jī)中列表(list)的實(shí)現(xiàn)原理及源碼剖析
在本篇文章當(dāng)中主要給大家介紹?cpython?虛擬機(jī)當(dāng)中針對(duì)列表的實(shí)現(xiàn),在?Python?中,List?是一種非常常用的數(shù)據(jù)類型,可以存儲(chǔ)任何類型的數(shù)據(jù),并且支持各種操作,如添加、刪除、查找、切片等,在本篇文章當(dāng)中將深入去分析這一點(diǎn)是如何實(shí)現(xiàn)的2023-03-03數(shù)據(jù)可視化Pyecharts的實(shí)際使用方式
這篇文章主要介紹了數(shù)據(jù)可視化Pyecharts的實(shí)際使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04python從Oracle讀取數(shù)據(jù)生成圖表
這篇文章主要介紹了python如何從Oracle讀取數(shù)據(jù)生成圖表,幫助大家更好的利用python處理數(shù)據(jù),感興趣的朋友可以了解下2020-10-10Python實(shí)現(xiàn)爬取騰訊招聘網(wǎng)崗位信息
這篇文章主要介紹了如何用python爬取騰訊招聘網(wǎng)崗位信息保存到表格,并做成簡單可視化。文中的示例代碼對(duì)學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-01-01