首頁  >  文章  >  後端開發  >  Python程式設計中的迭代器協定與遍歷方法

Python程式設計中的迭代器協定與遍歷方法

WBOY
WBOY轉載
2023-05-08 14:34:08940瀏覽

前言

前篇內容的介紹應該能很容易地讓我們理解掌握Python中的可迭代物件和迭代器(Iterable & Iterator)。本次內容我們來進一步介紹迭代器的相關內容。

Python程式設計中的迭代器協定與遍歷方法

迭代器協定

在Python中,迭代器(Iterator)物件需要支援以下兩個方法,它們一起構成迭代器協定:

1)__iter__():

物件的該方法傳回迭代器物件本身。這是要求容器和迭代器與for-in語句一起使用所必需的。你也可以使用內建的iter()函數,該函數實質上是在背後呼叫了__iter__()方法的。

2)__next__():

從迭代器傳回下一項。如果沒有其他項,則拋出StopIteration異常。也可以使用內建的next()函數讀取下一項,其實質也是呼叫__next__()方法。

正如我們在前所講過的,列表、元組、字典和集合都是可迭代型別。換句話說,它們是可以從中獲得迭代器的類型。看範例:

Python程式設計中的迭代器協定與遍歷方法

程式碼片段清單-01

輸入結果如下:

A
B
C

在範例程式碼中,我們定義了一個可迭代元組。然後對這個可迭代物件呼叫iter()函數。 iter()函數傳回一個迭代器,我們將其命名為tupIter。然後多次呼叫next()函數。 next()函數每次執行時,都會自動傳回迭代器中的下一個項目。

再看下一段範例程式碼:

Python程式設計中的迭代器協定與遍歷方法

程式碼片段-02

運行輸出的結果為:

P
y

在上述程式碼清單中,在字串物件上呼叫__ iter__()方法。字串物件實現了迭代器協議,所以字串是包含字元序列的可迭代物件的。直接呼叫__ iter__()方法就可傳回一個迭代器。接著再透過傳回的迭代器呼叫__ next__()方法,就可一個一個輸出迭代器中的元素內容。

一言以蔽之,只要實作了迭代器協定的對象,即可依照上面的兩種方法進行對象的迭代呼叫。

迭代器遍歷

如如我們在前介紹中所看到的,我們使用next()函數(或__next__()方法)手動遍歷迭代器的項目。當next()函數到達迭代器的末端時,就沒有更多的資料要返回,將會得到一個StopIteration異常。

請看範例:

Python程式設計中的迭代器協定與遍歷方法

程式碼片段清單-03

執行上述程序,輸出結果類似如下:

#

在上述程式碼中,呼叫了next()函數四次,這比迭代器中的項數還要多。在最後一個呼叫中得到了拋出的StopIteration異常-因為迭代器內元素項已經迭代完了。而且,為確保手動迭代完成後可能拋出的異常,得自行進行異常處理,否則後續將不再正常執行。

需要認識到的是:絕大多數場景下,我們不需要自己手動呼叫next方法,Python中的for迴圈能夠自動遍歷任何可以傳回迭代器的物件。換句話說,for迴圈可以遍歷Python中的任何可迭代物件。

請看範例:

Python程式設計中的迭代器協定與遍歷方法

程式碼清單片段04

在上述程式碼中,我們使用for迴圈遍歷前面定義的清單。顯而易見,我們沒有手動使用next()函數,也沒有得到任何StopIteration異常。這就是Python中for迴圈的美妙之處。它在幕後為我們處理所有這些。

當然,我們可以自行這樣來處理循環迭代。現在定義一個我們自己的for迴圈版本。我們將使用while循環並複製for迴圈的行為。在此,我們自己建立該實現所需的一切。如下所示:

Python程式設計中的迭代器協定與遍歷方法

程式碼清單片段-05

在上述清單中,我們實作了自己版本的模擬for迴圈。程式碼中使用無限while循環:while True。在循環中設定了一個try-except區塊。在try區塊中,透過呼叫迭代器上的__next__()方法來獲得下一個元素。如果呼叫成功,則列印出該元素。如果發生了StopIteration類型的錯誤,則在except區塊中捕獲該異常。在except區塊中所做的事情非常簡單。我們只是跳出這個循環,這意味著我們已經到達迭代器的末端。

小結

本篇內容就寫這些了,主要介紹了迭代器協定和和迭代器遍歷。內容的文字不長,再結合程式碼能幫助你更能理解和掌握這些Python程式設計知識點。

10

#20

# #30

Traceback (most recent call last):

File ……, in

print(next(listIter))

StopIteration

以上是Python程式設計中的迭代器協定與遍歷方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除