一.迭代器
迭代器指的是迭代取值的工具,迭代是指一個重復(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é)果:
