在Python中,不少對象都是能夠經過for語句來直接遍歷的,例如list、string、dict等等,這些對象均可以被稱爲可迭代對象。至於說哪些對象是能夠被迭代訪問的,就要了解一下迭代器相關的知識了。web
一、迭代協議數組
因爲迭代器自動實現了迭代器協議,而迭代器協議對不少人來講,也是一個較爲抽象的概念。因此,爲了更好的理解生成器,咱們須要簡單的回顧一下迭代器協議的概念。app
1.1.迭代協議是指:對象須要提供__next__()方法,它要麼返回迭代中的下一項,要麼就引發一個StopIteration異常,以終止迭代函數
1.2.可迭代對象就是:實現了迭代器協議的對象工具
1.3.協議是一種約定,可迭代對象實現迭代器協議,Python的內置工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象。測試
舉個例子:咱們可使用for循環來遍歷數組,因此,咱們可使用for循環來遍歷list。以下所示:spa
for x in [1,2,3]: print(x)
運行結果:code
1 2 3
可是,對Python稍微熟悉一點的朋友應該知道,Python的for循環不但能夠用來遍歷數組,還能夠用來遍歷文件對象,假設當前目錄下有一個文件,裏面存了一個列表,使用for循環把它遍歷出來,以下所示:orm
f = open('tete.txt',encoding='utf8') for line in f: print(line)
運行結果:對象
[1,2,3]
爲何在Python中,文件還可使用for循環進行遍歷呢?這是由於,在Python中,文件對象實現了迭代器協議,for循環並不知道它遍歷的是一個文件對象,它只管使用迭代器協議訪問對象便可。正是因爲Python的文件對象實現了迭代器協議,咱們才得以使用如此方便的方式訪問文件。
二、迭代器
迭代工具:for循環、推導、map等等,迭代工具又分:
2.一、迭代器對象(是已經幫你實現了迭代協議)
2.二、可迭代對象(列表,用for循環、推導、map也能實現,可是中間夾着一個額外的方法叫iter(),用於生成迭代器,用for循環、推導等等的時候它給列表調用了iter()的方法,幫咱們實現了next的功能,調用iter的時候內部會生成一個__iter__(),__iter__這個方法又幫咱們生成了__next__(),因此它就支持迭代了)
查看文件是否實現了iter迭代器功能:
f = open('tete.txt',encoding='utf8') print(iter(f) is f) # 測試對象自己是否帶有迭代器的功能,返回True或False
運行結果:
True
返回True就說明了文件自己已經實現了iter迭代器的功能。
本身生成迭代器(無論是用for仍是__next__(),只能迭代一次,還要迭代要從新鏈接文件):
lis = [1,2,3] i = iter(lis) # 經過iter函數將迭代對象轉換成迭代器, print(i.__next__()) print(i.__next__()) print(i.__next__())
運行結果:
1 2 3
若是多加一個print(i.__next__()),那就會報出一個StopIteration的異常。
手動迭代的方式:
lis = [1,2,3] shu = [] i = iter(lis) while True: try: x = shu.append(next(i)**2) # next方法遍歷獲得的i變量的結果,計算平方值,追加到shu列表裏 except StopIteration: # 捕獲一個異常叫StopIteration的時候 break # 就跳出循環 print(shu)
運行結果:
[1, 4, 9]
本文轉自:https://www.myblou.com/archives/1489