自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python編程:迭代器協(xié)議與遍歷,輕松搞定

開發(fā) 前端
本篇內(nèi)容就寫這些了,主要介紹了迭代器協(xié)議和和迭代器遍歷。內(nèi)容的文字不長(zhǎng),再結(jié)合代碼能幫助你更好地理解和掌握這些Python編程知識(shí)點(diǎn)。

前言

前篇內(nèi)容的介紹應(yīng)該能很容易地讓我們理解掌握??Python中的可迭代對(duì)象和迭代器(Iterable & Iterator)??。本次內(nèi)容我們來(lái)進(jìn)一步介紹迭代器的有關(guān)內(nèi)容。

迭代器協(xié)議

在Python中,迭代器(Iterator)對(duì)象需要支持以下兩個(gè)方法,它們一起構(gòu)成迭代器協(xié)議:

1)__iter__():

對(duì)象的該方法返回迭代器對(duì)象本身。這是要求容器和迭代器與for-in語(yǔ)句一起使用所必需的。你也可以使用內(nèi)置的iter()函數(shù),該函數(shù)實(shí)質(zhì)上是在背后調(diào)用了__iter__()方法的。

2)__next__():

從迭代器中返回下一項(xiàng)。如果沒有其他項(xiàng),則拋出StopIteration異常。也可以使用內(nèi)置的next()函數(shù)讀取下一項(xiàng),其實(shí)質(zhì)也是調(diào)用__next__()方法。

正如我們?cè)谇八v過的,列表、元組、字典和集合都是可迭代類型。換句話說(shuō),它們是可以從中獲得迭代器的類型??词纠?

代碼片段清單-01

輸入結(jié)果如下:

A
B
C

在示例代碼中,我們定義了一個(gè)可迭代元組。然后對(duì)這個(gè)可迭代對(duì)象調(diào)用iter()函數(shù)。iter()函數(shù)返回一個(gè)迭代器,我們將其命名為tupIter。然后多次調(diào)用next()函數(shù)。next()函數(shù)每次執(zhí)行時(shí),都會(huì)自動(dòng)返回迭代器中的下一項(xiàng)。

再看下一段示例代碼:

代碼片段-02

運(yùn)行輸出的結(jié)果為:

P
y

在上述代碼清單中,在字符串對(duì)象上調(diào)用__ iter__()方法。字符串對(duì)象實(shí)現(xiàn)了迭代器協(xié)議,所以字符串是包含字符序列的可迭代對(duì)象的。直接調(diào)用__ iter__()方法就可返回一個(gè)迭代器。然后再通過返回的迭代器調(diào)用__ next__()方法,就可一個(gè)一個(gè)地輸出迭代器中的元素內(nèi)容。

一言以蔽之,只要實(shí)現(xiàn)了迭代器協(xié)議的對(duì)象,即可按照上面的兩種方法進(jìn)行對(duì)象的迭代調(diào)用。

迭代器遍歷

正如我們?cè)谇敖榻B中看到的,我們使用next()函數(shù)(或__next__()方法)手動(dòng)遍歷迭代器的項(xiàng)。當(dāng)next()函數(shù)到達(dá)迭代器的末尾時(shí),就沒有更多的數(shù)據(jù)要返回,將得到一個(gè)StopIteration異常。

請(qǐng)看示例:

代碼片段清單-03

運(yùn)行上述程序,輸出結(jié)果類似如下:

10

20

30

Traceback (most recent call last):

File ……, in <module>

print(next(listIter))

StopIteration

在上述代碼中,調(diào)用了next()函數(shù)四次,這比迭代器中的項(xiàng)數(shù)還要多。在最后一個(gè)調(diào)用中得到了拋出的StopIteration異?!?yàn)榈鲀?nèi)元素項(xiàng)已經(jīng)迭代完了。而且,為保證手動(dòng)迭代完成后可能拋出的異常,得自行進(jìn)行異常處理,否則后續(xù)將不再正常執(zhí)行。

需要認(rèn)識(shí)到的是:絕大多數(shù)場(chǎng)景下,我們不需要自己手動(dòng)調(diào)用next方法,Python中的for循環(huán)能夠自動(dòng)遍歷任何可以返回迭代器的對(duì)象。換句話說(shuō),for循環(huán)可以遍歷Python中的任何可迭代對(duì)象。

請(qǐng)看示例:

代碼清單片段04

在上述代碼中,我們使用for循環(huán)遍歷前面定義的列表。顯而易見,我們沒有手動(dòng)使用next()函數(shù),也沒有獲得任何StopIteration異常。這就是Python中for循環(huán)的美妙之處。它在幕后為我們處理所有這些。

當(dāng)然,我們可以自行這樣來(lái)處理循環(huán)迭代?,F(xiàn)在定義一個(gè)我們自己的for循環(huán)版本。我們將使用while循環(huán)并復(fù)制for循環(huán)的行為。在此,我們自己構(gòu)建該實(shí)現(xiàn)所需的一切。如下所示:

代碼清單片段-05

在上述清單中,我們實(shí)現(xiàn)了自己版本的模擬for循環(huán)。代碼中使用無(wú)限while循環(huán):while True。在循環(huán)中設(shè)置了一個(gè)try-except塊。在try塊中,通過調(diào)用迭代器上的__next__()方法獲得下一個(gè)元素。如果調(diào)用成功,則打印出該元素。如果發(fā)生了StopIteration類型的錯(cuò)誤,則在except塊中捕獲該異常。在except塊中所做的事情非常簡(jiǎn)單。我們只是跳出這個(gè)循環(huán),這意味著我們已經(jīng)到達(dá)迭代器的末端。

小結(jié)

本篇內(nèi)容就寫這些了,主要介紹了迭代器協(xié)議和和迭代器遍歷。內(nèi)容的文字不長(zhǎng),再結(jié)合代碼能幫助你更好地理解和掌握這些Python編程知識(shí)點(diǎn)。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2022-10-26 08:25:06

Python編程迭代器

2025-02-07 08:39:32

Shell部署測(cè)試

2024-08-26 08:27:18

2024-08-02 09:00:17

NettyWebSocketNIO

2023-11-07 10:10:36

設(shè)計(jì)模式元素

2021-11-28 08:03:41

Python迭代器對(duì)象

2024-11-14 08:00:00

Python迭代器

2010-09-13 14:17:34

2009-11-24 15:34:41

DNS服務(wù)器組建

2009-08-19 15:18:53

迭代器

2020-05-11 10:59:02

PythonWord工具

2016-03-28 10:39:05

Python迭代迭代器

2009-02-16 15:35:00

2020-11-24 08:00:22

JavaScript對(duì)象迭代器

2022-09-16 08:04:25

阿里云權(quán)限網(wǎng)絡(luò)

2009-12-11 15:37:58

Linux日志處理

2017-05-11 15:01:43

Androidweb布局

2009-11-13 17:32:37

2024-12-27 08:39:10

2010-03-15 12:50:19

Python文件夾創(chuàng)建
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)