Python迭代器和生成器定義與用法示例
本文實(shí)例講述了Python迭代器和生成器定義與用法。分享給大家供大家參考,具體如下:
迭代器 iter()
迭代器是訪問(wèn)集合中元素的一種方式,迭代器 object 從集合中的第一個(gè)元素開(kāi)始訪問(wèn),直到所有的元素被訪問(wèn)完成.
所以迭代器的特點(diǎn)是:只能往前,不能后退
迭代器的優(yōu)點(diǎn):不需要提前準(zhǔn)備整個(gè)迭代器中的所有元素,僅僅迭代到某個(gè)元素時(shí)才計(jì)算該元素,而之前或者之后,元素可以不存在或者銷(xiāo)毀.因?yàn)檫@個(gè)特點(diǎn),迭代器特別適合遍歷文件比較大或者無(wú)限的集合.
總結(jié)下迭代器 iter()
的特點(diǎn)吧:
1.訪問(wèn)者不需要關(guān)心迭代器內(nèi)部的結(jié)構(gòu),僅需通過(guò)next()方法不斷去取下一個(gè)內(nèi)容
2.不能隨機(jī)訪問(wèn)集合中的某個(gè)值 ,只能從頭到尾依次訪問(wèn)
3.訪問(wèn)到一半時(shí)不能往回退
4.便于循環(huán)比較大的數(shù)據(jù)集合,節(jié)省內(nèi)存
**迭代器是用__next__()
來(lái)取值的,來(lái)看個(gè)例子吧:
li=[1,2,3,4,56,78] a=iter(li) print(a.__next__()) print(a.__next__()) print(a.__next__()) print(a.__next__()) print(a.__next__()) print(a.__next__()) #取值到最后一個(gè)元素787 print(a.__next__())
輸出:
1 2 3 4 56 78 #開(kāi)始報(bào)錯(cuò) Traceback (most recent call last): File "/Users/shane/PycharmProjects/Py_study/Base/S5/iter_test.py", line 14, in <module> print(a.__next__()) StopIteration
生成器generator
一個(gè)函數(shù)調(diào)用時(shí)返回一個(gè)迭代器,那這個(gè)函數(shù)就叫做生成器(generator);如果函數(shù)中包含yield語(yǔ)法,那這個(gè)函數(shù)就會(huì)變成生成器
yield是個(gè)什么鬼?yield 其實(shí)和函數(shù)中的 return 一樣,一樣的是都會(huì)返回定義好的值,但不同的是,return 是退出函數(shù),yield 只是暫停函數(shù)執(zhí)行,等待下一次迭代器取值
我們來(lái)看個(gè)例子:
def func(): print(111) yield 1 print(222) yield 2 print(333) yield 3 ret=func() r1=ret.__next__() print(r1) #如果沒(méi)有 print,只會(huì)返回111
out:
111 1
一個(gè)典型的生成器的取值方式:
def func(): print(111) yield 1 print(222) yield 2 print(333) yield 3 ret=func() r1=ret.__next__() print(r1) r2=ret.__next__() print(r2) r3=ret.__next__() print(r3) r4=ret.__next__() #如果沒(méi)有 r4就不會(huì)報(bào)錯(cuò),因?yàn)橐呀?jīng)沒(méi)值可取了 print(r4)
out:
Traceback (most recent call last): File "/Users/shane/PycharmProjects/Py_study/Base/S5/geno.py", line 21, in <module> r4=ret.__next__() StopIteration 111 1 222 2 333 3
進(jìn)程已結(jié)束,退出代碼1
來(lái)看一個(gè)比較完整一點(diǎn)的生成器和迭代器吧:
def myrange(args): start=0 while True: if start > args: return else: yield start start+=1 res=myrange(3) ret=res.__next__() print(ret) ret=res.__next__() print(ret) ret=res.__next__() print(ret) ret=res.__next__() print(ret) ret=res.__next__() print(ret)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python實(shí)現(xiàn)藍(lán)線挑戰(zhàn)特效的示例代碼
在抖音曾經(jīng)火了一陣子的藍(lán)線挑戰(zhàn)特效,其原理很簡(jiǎn)單。本文將試著用opencv-python實(shí)現(xiàn)這個(gè)效果,做了攝像頭版本和視頻處理版本,感興趣的可以學(xué)習(xí)一下2022-10-10Python Pillow 圖像處理庫(kù)詳解(常用Pillow函數(shù)及其參數(shù))
Pillow,原名PIL(Python Imaging Library),是一個(gè)功能強(qiáng)大的Python圖像處理庫(kù),支持多種格式,提供豐富的圖像操作功能,如旋轉(zhuǎn)、縮放、顏色轉(zhuǎn)換等,以及易于使用的API,Pillow支持廣泛的圖像文件格式,并提供圖像過(guò)濾、繪制等功能2024-09-09django 解決擴(kuò)展自帶User表遇到的問(wèn)題
這篇文章主要介紹了django 解決擴(kuò)展自帶User表遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05用Python讀取幾十萬(wàn)行文本數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于用Python讀取幾十萬(wàn)行文本數(shù)據(jù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12基于Python實(shí)現(xiàn)通過(guò)微信搜索功能查看誰(shuí)把你刪除了
這篇文章主要介紹了基于Python實(shí)現(xiàn)微信搜索查看誰(shuí)把你刪除了的相關(guān)資料,需要的朋友可以參考下2016-01-01安裝出現(xiàn):Requirement?already?satisfied解決辦法
最近pip install的時(shí)候報(bào)錯(cuò),一大串Requirement already satisfied,所以下面這篇文章主要給大家介紹了關(guān)于安裝出現(xiàn):Requirement?already?satisfied的解決辦法,需要的朋友可以參考下2022-08-08Python中的標(biāo)簽編碼和獨(dú)熱編碼示例詳解
標(biāo)簽編碼是一種用于將分類列轉(zhuǎn)換為數(shù)值列的技術(shù),以便它們可以通過(guò)僅采用數(shù)值數(shù)據(jù)的機(jī)器學(xué)習(xí)模型進(jìn)行擬合,這篇文章主要介紹了Python中的標(biāo)簽編碼和獨(dú)熱編碼,需要的朋友可以參考下2023-07-07