一 : 迭代器協(xié)議簡述 :
迭代器協(xié)議是指,對象必須提供一個(gè)next
方法,執(zhí)行該方法要么返回迭代中的下一項(xiàng),要么就引起一個(gè)Stoplteration異常,以終止迭代,(只能往前面走不能往后面退)
可迭代對象 : 實(shí)現(xiàn)了迭代器協(xié)議的對象
協(xié)議是一種約定,可迭代對象實(shí)現(xiàn)了迭代器協(xié)議,python的內(nèi)部工具(如for循環(huán),sum,min,max函數(shù))使用迭代器協(xié)議訪問對象
二 : for循環(huán)內(nèi)部原理
for循環(huán)的本質(zhì)就是循環(huán)所有對象,全都使用迭代器協(xié)議
(字符串 , 列表 , 元祖 , 字典 ,集合 ,文件對象) 這些都不是可迭代對象,只不過for循環(huán)中調(diào)用了他們內(nèi)部的__iter__
方法,把他們變成了可迭代對象
然后for循環(huán)調(diào)用可迭代對象的__next__
方法去取值,而for循環(huán)會捕捉Stoplteration
異常,終止迭代
將字符串變?yōu)榭傻鷮ο?/h6>
mystr = '思思'
iter_test = mystr.__iter__()
print(iter_test)
<str_iterator object at 0x10f30a198>
調(diào)用__next__
方法
print(iter_test.__next__())
print(iter_test.__next__())
思
思
第三次調(diào)用__next__
報(bào)錯(cuò)
print(iter_test.__next__())
print(iter_test.__next__())
StopIteration
在for循環(huán)中相當(dāng)于先調(diào)用__iter__()
在調(diào)用__next__()
mystr = '思思'
iter_test = mystr.__iter__()
print(iter_test)
<str_iterator object at 0x10f30a198>
__next__
方法print(iter_test.__next__())
print(iter_test.__next__())
思
思
__next__
報(bào)錯(cuò)print(iter_test.__next__())
print(iter_test.__next__())
StopIteration
__iter__()
在調(diào)用__next__()
把 l
先變成可迭代對象,再調(diào)用其__next__()
方法
l = [1,2,3]
for i in l: #i_l = l.__iter__() i_l.__next__()
print(i)
for循環(huán)就是基迭代器協(xié)議提供了一個(gè)統(tǒng)一的可以遍歷所有對象的方法,包括序列類型與非序列類型,即在遍歷之前,先調(diào)用對象的__iter__
方法將其轉(zhuǎn)換成一個(gè)迭代器,然后使用迭代器協(xié)議去實(shí)現(xiàn)循環(huán)訪問,這樣所有的對象就可以通過for循環(huán)來遍歷了
-
遍歷集合
for i in {1,2,3}:
print(i)
-
遍歷文件
相當(dāng)于將 f
變成可迭代對象f.__iter__()
,然后再f.__next__()
,這個(gè)迭代器對象并不是把所有的文件資源放入內(nèi)存中,而是一個(gè)對象,類似于一個(gè)地址
for i in f:
print(i)
-
next()
next
與 __next__()
效果一樣