搜尋
首頁後端開發Python教學Python程式設計中的迭代器協定與遍歷方法

前言

前篇內容的介紹應該能很容易地讓我們理解掌握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刪除
Python的科學計算中如何使用陣列?Python的科學計算中如何使用陣列?Apr 25, 2025 am 12:28 AM

Arraysinpython,尤其是Vianumpy,ArecrucialInsCientificComputingfortheireftheireffertheireffertheirefferthe.1)Heasuedfornumerericalicerationalation,dataAnalysis和Machinelearning.2)Numpy'Simpy'Simpy'simplementIncressionSressirestrionsfasteroperoperoperationspasterationspasterationspasterationspasterationspasterationsthanpythonlists.3)inthanypythonlists.3)andAreseNableAblequick

您如何處理同一系統上的不同Python版本?您如何處理同一系統上的不同Python版本?Apr 25, 2025 am 12:24 AM

你可以通過使用pyenv、venv和Anaconda來管理不同的Python版本。 1)使用pyenv管理多個Python版本:安裝pyenv,設置全局和本地版本。 2)使用venv創建虛擬環境以隔離項目依賴。 3)使用Anaconda管理數據科學項目中的Python版本。 4)保留系統Python用於系統級任務。通過這些工具和策略,你可以有效地管理不同版本的Python,確保項目順利運行。

與標準Python陣列相比,使用Numpy數組的一些優點是什麼?與標準Python陣列相比,使用Numpy數組的一些優點是什麼?Apr 25, 2025 am 12:21 AM

numpyarrayshaveseveraladagesoverandastardandpythonarrays:1)基於基於duetoc的iMplation,2)2)他們的aremoremoremorymorymoremorymoremorymoremorymoremoremory,尤其是WithlargedAtasets和3)效率化,效率化,矢量化函數函數函數函數構成和穩定性構成和穩定性的操作,製造

陣列的同質性質如何影響性能?陣列的同質性質如何影響性能?Apr 25, 2025 am 12:13 AM

數組的同質性對性能的影響是雙重的:1)同質性允許編譯器優化內存訪問,提高性能;2)但限制了類型多樣性,可能導致效率低下。總之,選擇合適的數據結構至關重要。

編寫可執行python腳本的最佳實踐是什麼?編寫可執行python腳本的最佳實踐是什麼?Apr 25, 2025 am 12:11 AM

到CraftCraftExecutablePythcripts,lollow TheSebestPractices:1)Addashebangline(#!/usr/usr/bin/envpython3)tomakethescriptexecutable.2)setpermissionswithchmodwithchmod xyour_script.3)

Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具