一脉漏、什么是迭代器協(xié)議
1.迭代器協(xié)議是指:對象必須提供一個next方法,執(zhí)行該方法要么返回迭代中的下一項袖牙,要么就引起一個stoplteration異常侧巨,以終止迭代(只能? ? ? ? ? ? ?往后走,不能往前退)
2.可迭代對象:實現(xiàn)了迭代器協(xié)議的對象(如何實現(xiàn):對象內(nèi)部定義一個__iter__()方法)
3.協(xié)議是一種約定鞭达,可迭代對象實現(xiàn)了迭代器協(xié)議刃泡,python的內(nèi)部工具(如for循環(huán),sum碉怔,min烘贴,max函數(shù)等)使用迭代器協(xié)議訪問對象
可迭代對象
可迭代對象泛指一類對象,不是指的每一種對象撮胧,確切的說滿足以下的條件的對象可以成為可迭代對象:
1. 對象實現(xiàn)了__iter__方法
2. __iter__方法返回了一個迭代器對象
我們比較容易理解的可迭代對象桨踪,比如說可以用for語句去遍歷,實際for語句的內(nèi)部實現(xiàn)應(yīng)該就是首先調(diào)用對象的__iter__方法芹啥,獲取一個迭代器對象锻离,接著不停的調(diào)用迭代器對象的__next__方法,循環(huán)遍歷取值墓怀。
迭代器對象(迭代器)
迭代器協(xié)議包括這些條件:
1.對象實現(xiàn)了__next__方法
2.__next__方法返回了某個數(shù)值(當(dāng)然一般情況下汽纠,我們需要的是返回這個對象的特定的數(shù)字,并且按照一定的順序進行依次返回)
3.__next__方法需要在值取完的時候傀履,拋出StopIteration的錯誤信息虱朵。
總結(jié):
可迭代對象是 調(diào)用對象的__iter__方法能夠返回迭代器對象的一種對象。
迭代器對象是實現(xiàn)了迭代器協(xié)議的對象钓账。
迭代器應(yīng)用
運行主函數(shù)
二碴犬、什么是生成器?
可以理解為一種數(shù)據(jù)類型梆暮,這種數(shù)據(jù)類型自動實現(xiàn)了迭代器協(xié)議(其他的數(shù)據(jù)類型需要調(diào)用自己的內(nèi)置的__iter__方法)服协,所以生成器就是可迭代對象
1.生成器函數(shù):常規(guī)函數(shù)的定義,但是啦粹,使用yield語句而不是return語句返回結(jié)果偿荷。yield語句語句一次返回一個結(jié)果窘游,在每個結(jié)果中間,掛起函數(shù)的狀態(tài)跳纳,以便下次從它離開的地方繼續(xù)執(zhí)行
2.生成器表達式:類似于列表推導(dǎo)忍饰,但是,生成器返回按需產(chǎn)生結(jié)果的一個對象棒旗,而不是一次構(gòu)建一個結(jié)果列表
為何使用生成器之生成器的特點
Python使用生成器對延遲操作提供了支持喘批。所謂延遲操作撩荣,是指在需要的時候才產(chǎn)生結(jié)果铣揉,而不是立即產(chǎn)生結(jié)果。這也是生產(chǎn)層器的主要好處餐曹。
生成器小結(jié):
a.是可迭代對象
b.實現(xiàn)了延遲計算逛拱,省內(nèi)存
c.生成器本質(zhì)和其他的數(shù)據(jù)類型一樣,都是實現(xiàn)了迭代器協(xié)議台猴,只不過生成器附加了一個延遲計算省內(nèi)存的好處
三朽合、生成器讀取大量數(shù)據(jù)應(yīng)用案例
文件實例: