迭代器
迭代器對象要求支持迭代器協(xié)議的對象件相,在Python中,支持迭代器協(xié)議就是實現(xiàn)對象的__iter__()和next()方法钞馁。其中__iter__()方法返回迭代器對象本身锨络;next()方法返回容器的下一個元素闺金,在結(jié)尾時引發(fā)StopIteration異常碉怔。
__iter__()和next()方法
這兩個方法是迭代器最基本的方法烘贴,一個用來獲得迭代器對象,一個用來獲取容器中的下一個元素撮胧。對于可迭代對象桨踪,可以使用內(nèi)建函數(shù)iter()來獲取它的迭代器對象:
iter()可以接受多種Python對象為參數(shù),比如list芹啥,tuple, dict, set等锻离,并將其轉(zhuǎn)化為迭代器。迭代器可以用于for語句或in語句中墓怀。很多常用操作也是支持迭代器的汽纠,比如sum(),max()等。
生成器
在Python中捺疼,使用生成器可以很方便的支持迭代器協(xié)議。生成器通過生成器函數(shù)產(chǎn)生永罚,生成器函數(shù)可以通過常規(guī)的def語句來定義啤呼,但是不用return返回,而是用yield一次返回一個結(jié)果呢袱,在每個結(jié)果之間掛起和繼續(xù)它們的狀態(tài)官扣,來自動實現(xiàn)迭代協(xié)議。
也就是說羞福,yield是一個語法糖惕蹄,內(nèi)部實現(xiàn)支持了迭代器協(xié)議,同時yield內(nèi)部是一個狀態(tài)機治专,維護著掛起和繼續(xù)的狀態(tài)卖陵。
什么是生成器?
保存了生成結(jié)果的的算法結(jié)構(gòu)张峰,可以推算出后面的元素泪蔫。
沒有生成所有結(jié)果值,也沒有存到內(nèi)存中喘批。效率提高撩荣。
這些數(shù)字并沒有生成铣揉,也沒有存到內(nèi)存中。
生成器對象餐曹,只是保存了生成這些數(shù)字的算法結(jié)構(gòu)逛拱,可以推算出后面的元素。
這樣台猴,如果需要取特定的內(nèi)存朽合,而不是全部加載。
效率提高卿吐。
生成器的第一種方式:
ge = (x? for? x? in? range(1000000))
print(ge)
print(type(ge))
3.yield用法:
生成器的第二種方式:
1旁舰、定義函數(shù)
2、函數(shù)中有yield值
當調(diào)用生成器函數(shù)的時候嗡官,函數(shù)只是返回了一個生成器對象箭窜,并沒有 執(zhí)行。
當next()方法第一次被調(diào)用的時候衍腥,生成器函數(shù)才開始執(zhí)行磺樱,執(zhí)行到y(tǒng)ield語句處停止
next()方法的返回值就是yield語句處的參數(shù)(yielded value)
當繼續(xù)調(diào)用next()方法的時候,函數(shù)將接著上一次停止的yield語句處繼續(xù)執(zhí)行婆咸,并到下一個yield處停止竹捉;如果后面沒有yield就拋出StopIteration異常
總結(jié):
Generator:生成器,保存算法尚骄,可以推算出下一個
Iterator:迭代器:從對象的第一個元素開始訪問块差,直到所有的元素被訪問結(jié)束。
Iterable:生成器是可以迭代的倔丈,也可以理解為可迭代的對象
通過實現(xiàn)迭代器協(xié)議對應(yīng)的__iter__()和next()方法憨闰,可以自定義迭代器類型。對于可迭代對象需五,for語句可以通過iter()方法獲取迭代器鹉动,并且通過next()方法獲得容器的下一個元素。
像列表這種序列類型的對象宏邮,可迭代對象和迭代器對象是相互獨立存在的泽示,在迭代的過程中各個迭代器相互獨立;但是蜜氨,有的可迭代對象本身又是迭代器對象械筛,那么迭代器就沒法獨立使用。
itertools模塊提供了一系列迭代器飒炎,能夠幫助用戶輕松地使用排列变姨、組合、笛卡爾積或其他組合結(jié)構(gòu)厌丑。
生成器是一種特殊的迭代器定欧,內(nèi)部支持了生成器協(xié)議渔呵,不需要明確定義__iter__()和next()方法。
生成器通過生成器函數(shù)產(chǎn)生砍鸠,生成器函數(shù)可以通過常規(guī)的def語句來定義扩氢,但是不用return返回,而是用yield一次返回一個結(jié)果