如何理解Python迭代器?

在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

相關文章
相關標籤/搜索