Python學(xué)習(xí)筆記之迭代器和生成器用法實(shí)例詳解
本文實(shí)例講述了Python學(xué)習(xí)筆記之迭代器和生成器用法。分享給大家供大家參考,具體如下:
迭代器和生成器
迭代器
- 每次可以返回一個(gè)對(duì)象元素的對(duì)象,例如返回一個(gè)列表。我們到目前為止使用的很多內(nèi)置函數(shù)(例如 enumerate)都會(huì)返回一個(gè)迭代器。
- 是一種表示數(shù)據(jù)流的對(duì)象。這與列表不同,列表是可迭代對(duì)象,但不是迭代器,因?yàn)樗皇菙?shù)據(jù)流。
生成器
- 是使用函數(shù)創(chuàng)建迭代器的簡(jiǎn)單方式。也可以使用類定義迭代器
下面是一個(gè)叫做 my_range 的生成器函數(shù),它會(huì)生成一個(gè)從 0 到 (x - 1) 的數(shù)字流:
def my_range(x): i = 0 while i < x: yield i i += 1
該函數(shù)使用了 yield 而不是關(guān)鍵字 return。這樣使函數(shù)能夠一次返回一個(gè)值,并且每次被調(diào)用時(shí)都從停下的位置繼續(xù)。關(guān)鍵字 yield
是將生成器與普通函數(shù)區(qū)分開(kāi)來(lái)的依據(jù)。
因?yàn)樯鲜龃a會(huì)返回一個(gè)迭代器,因此我們可以將其轉(zhuǎn)換為列表或用 for 循環(huán)遍歷它,以查看其內(nèi)容。例如,下面的代碼:
for x in my_range(5): print(x)
輸出如下:
0
1
2
3
4
為何要使用生成器?
- 生成器是構(gòu)建迭代器的 “懶惰” 方式。當(dāng)內(nèi)存不夠存儲(chǔ)完整實(shí)現(xiàn)的列表時(shí),或者計(jì)算每個(gè)列表元素的代價(jià)很高,你希望盡量推遲計(jì)算時(shí),就可以使用生成器。但是這些元素只能遍歷一次。
- 由于使用生成器是一次處理一個(gè)數(shù)據(jù),在內(nèi)存和存儲(chǔ)的需求上會(huì)比使用list方式直接全部生成再存儲(chǔ)節(jié)省很多資源。由此區(qū)別,在處理大量數(shù)據(jù)時(shí),經(jīng)常使用生成器初步處理數(shù)據(jù)后,再進(jìn)行長(zhǎng)期存儲(chǔ),而不是使用 list。
- 因?yàn)闊o(wú)論使用生成器還是 list,都是使用過(guò)就要丟棄的臨時(shí)數(shù)據(jù)。既然功能和結(jié)果一樣,那就不如用生成器。
- 但是生成器也有自己的局限,它產(chǎn)生的數(shù)據(jù)不能回溯,不像list可以任意選擇。
迭代器和生成器[相關(guān)練習(xí)]
請(qǐng)自己寫(xiě)一個(gè)效果和內(nèi)置函數(shù) enumerate 一樣的生成器函數(shù)。如下所示地調(diào)用該函數(shù):
lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"] for i, lesson in my_enumerate(lessons, 1): print("Lesson {}: {}".format(i, lesson))
應(yīng)該會(huì)輸出:
Lesson 1: Why Python Programming
Lesson 2: Data Types and Operators
Lesson 3: Control Flow
Lesson 4: Functions
Lesson 5: Scripting
解決方案:
lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"] def my_enumerate(iterable, start=0): # Implement your generator function here i = start for element in iterable: yield i, element i += 1 for i, lesson in my_enumerate(lessons, 1): print("Lesson {}: {}".format(i, lesson))
如果可迭代對(duì)象太大,無(wú)法完整地存儲(chǔ)在內(nèi)存中(例如處理大型文件時(shí)),每次能夠使用一部分很有用。實(shí)現(xiàn)一個(gè)生成器函數(shù) chunker,接受一個(gè)可迭代對(duì)象并每次生成指定大小的部分?jǐn)?shù)據(jù)。如下所示地調(diào)用該函數(shù):
for chunk in chunker(range(25), 4): print(list(chunk))
應(yīng)該會(huì)輸出:
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
[16, 17, 18, 19]
[20, 21, 22, 23]
[24]
解決方案:
def chunker(iterable, size): for i in range(0, len(iterable), size): yield iterable[i:i + size] for chunk in chunker(range(25), 4): print(list(chunk))
學(xué)習(xí)參考:
https://www.python.org/dev/peps/pep-0257/
https://docs.python.org/3/tutorial/classes.html#iterators
https://softwareengineering.stackexchange.com/questions/290231/when-should-i-use-a-generator-and-when-a-list-in-python/290235
https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python 協(xié)程中的迭代器,生成器原理及應(yīng)用實(shí)例詳解
- Python迭代器iterator生成器generator使用解析
- python 生成器和迭代器的原理解析
- 詳解python中的生成器、迭代器、閉包、裝飾器
- 一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器
- Python進(jìn)階:生成器 懶人版本的迭代器詳解
- 一篇文章徹底搞懂Python中可迭代(Iterable)、迭代器(Iterator)與生成器(Generator)的概念
- 淺談Python中的可迭代對(duì)象、迭代器、For循環(huán)工作機(jī)制、生成器
- Python通過(guò)for循環(huán)理解迭代器和生成器實(shí)例詳解
- 正確理解python迭代器與生成器
相關(guān)文章
Python全局變量與global關(guān)鍵字常見(jiàn)錯(cuò)誤解決方案
這篇文章主要介紹了Python全局變量與global關(guān)鍵字常見(jiàn)錯(cuò)誤解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10python ImageDraw類實(shí)現(xiàn)幾何圖形的繪制與文字的繪制
這篇文章主要介紹了python ImageDraw類實(shí)現(xiàn)幾何圖形的繪制與文字的繪制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02使用django實(shí)現(xiàn)一個(gè)代碼發(fā)布系統(tǒng)
這篇文章主要介紹了使用django實(shí)現(xiàn)一個(gè)代碼發(fā)布系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07urllib和BeautifulSoup爬取維基百科的詞條簡(jiǎn)單實(shí)例
這篇文章主要介紹了urllib和BeautifulSoup爬取維基百科的詞條簡(jiǎn)單實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01導(dǎo)致python中import錯(cuò)誤的原因是什么
在本篇文章里小編給大家整理了關(guān)于python的import錯(cuò)誤原因以及相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-07-07Python使用shelve模塊實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)存儲(chǔ)的方法
這篇文章主要介紹了Python使用shelve模塊實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)存儲(chǔ)的方法,涉及shelve模塊實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的技巧,需要的朋友可以參考下2015-05-05python給指定csv表格中的聯(lián)系人群發(fā)郵件(帶附件的郵件)
這篇文章主要介紹了python給指定csv表格中的聯(lián)系人群發(fā)郵件,本文通過(guò)代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12一文詳解如何配置Pycharm進(jìn)行遠(yuǎn)程開(kāi)發(fā)
在搞深度學(xué)習(xí)的時(shí)候,我們?cè)诒镜亻_(kāi)發(fā),但是需要在服務(wù)器去運(yùn)行工程,所以需要使用Pycharm進(jìn)行遠(yuǎn)程配置,下面這篇文章主要給大家介紹了關(guān)于如何配置Pycharm進(jìn)行遠(yuǎn)程開(kāi)發(fā)的相關(guān)資料,需要的朋友可以參考下2024-02-02