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