python 生成器與迭代器

一.迭代器

迭代器指的是迭代取值的工具,迭代是指一個重復(fù)的過程,每一次重復(fù)都是基于上一次結(jié)果而來

  迭代提供了一種通用的不依賴索引的迭代取值方式

一.可迭代對象

    但凡內(nèi)置有__iter__方法的對象,都稱為可迭代對象,可迭代的對象:str,list,tuple,dict,set,文件對象

二.迭代器對象

    1既內(nèi)置又__next__方法的對象,執(zhí)行該方法可以不依賴索引取值

    2.又內(nèi)置有__iter__方法的對象,執(zhí)行迭代器的__iter__方法得到的依然是迭代器本身

    迭代器一定是可迭代對象,可迭代對象不一定是迭代器對象,文件對象本身就是一個迭代器對象

  例如:執(zhí)行可迭代對象下的__iter__方法,返回一個迭代器對象,在通過迭代器對象的__next__方法取值,如果取值次數(shù)超過源值的數(shù)量就會報錯

執(zhí)行結(jié)果:

for循環(huán)本質(zhì)為迭代器循環(huán)

  工作原理:

    1.先調(diào)用in后對象的__iter__方法,將其變成一個迭代器對象

    2.調(diào)用next(迭代器),將得到的返回值賦值給變量名

    3.循環(huán)往復(fù)直到next(迭代器)拋出異常,for會自動捕捉異常然后結(jié)束循環(huán)

  ps:可以從for的角度,分辨但凡可以被for循環(huán)取值的對象就是可迭代對象

  迭代器優(yōu)點:

    1.提供了一種通用不依賴索引的迭代取值方式

    2.同一時刻在內(nèi)存中只存在一個值,更節(jié)省內(nèi)存

  迭代器缺點:

    1.取值不如按照索引的方式靈活,不能取指定的某一個值,只能往后取,不能往前去

    2.無法預(yù)測迭代器的長度

二.生成器

生成器就是一種自定義的迭代器,本質(zhì)為迭代器

  但凡函數(shù)內(nèi)包含yield關(guān)鍵字,調(diào)用函數(shù)不會執(zhí)行函數(shù)體代碼,會得到一個返回值,該返回值就是生成器對象

  例如:

執(zhí)行結(jié)果:

總結(jié)yield:只能在函數(shù)內(nèi)使用

    1.yield提供了一種自定義迭代器的解決方案

    2.yield可以保存函數(shù)的暫停的狀態(tài)

    3.yield對比return:相同點,都可以返回值,值得類型與個數(shù)沒有限制,不同點:yield可以返回多次值,而return只能返回一次值函數(shù)就會結(jié)束

三.生成器表達式

類似于列表生成式

  執(zhí)行結(jié)果:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容