python迭代器與iter 函式例項教程

2022-07-17 00:54:15 字數 4240 閱讀 8940

python迭代器與iter()函式例項教程

本文介紹了python迭代器與iter()函式的用法,python 的迭代無縫地支援序列物件,而且它還允許程式設計師迭代非序列型別,包括使用者定義的物件。

迭代器是在版本 2.2 被加入 python 的,它為類序列物件提供了乙個類序列的介面。

序列是一組資料結構,你可以利用它們的索引從0 開始一直「迭代「 到序列的最後乙個條目。

用「計數「的方法迭代序列是很簡單的。

python 的迭代無縫地支援序列物件,而且它還允許程式設計師迭代非序列型別,包括使用者定義的物件。

迭代器用起來很靈巧,可以迭代不是序列但表現出序列行為的物件,例如字典的 key,乙個檔案的行等。

當使用迴圈迭代乙個物件條目時,幾乎不可能分辨出它是迭代器還是序列。不必去關注這些,因為 python 讓它象乙個序列那樣操作。

如何迭代?

迭代器就是有乙個 next() 方法的物件,而不是通過索引來計數。當你或是乙個迴圈機制(例如 for 語句)需要下乙個項時,呼叫迭代器的 next() 方法就可以獲得它。條目全部取出後,會引發乙個 stopiteration 異常,這並不表示錯誤發生,只是告訴外部呼叫者,迭代完成.

不過,迭代器也有一些限制。例如你不能向後移動,不能回到開始,也不能複製乙個迭代器.如果你要再次(或者是同時)迭代同個物件,你只能去建立另乙個迭代器物件。不過,這並不糟糕,因為還有其他的工具來幫助你使用迭代器。(www.jbxue.com 指令碼學堂 整理)

reversed() 內建函式將返回乙個反序訪問的迭代器。enumerate() 內建函式同樣也返回迭代器.另外兩個新的內建函式,any() 和 all() ,在 python 2.5 中新增,如果迭代器中某個/所有條目的值都為布林真時,則它們返回值為真。本章先前部分展示了如何在 for 迴圈中通過索引或是可迭代物件來遍歷條目。同時 python 還提供了一整個 itertools 模組,它包含各種有用的迭代器.

一,使用迭代器

===序列===

正如先前提到的,迭代 python 的序列物件和你想像的一樣:

複製****示例:

>>> mytuple = (123,『xyz』,45.67)

>>> i = iter(mytuple)

>>> i.next()

123>>> i.next()

『xyz』

>>> i.next()

45.67

>>> i.next()

traceback (most recent call last):

file 「」,line 1,in

stopiteration

如果這是乙個實際應用程式,那麼需要把**放在乙個 try-except 塊中。序列現在會自動地產生它們自己的迭代器,所以乙個 for 迴圈: 

複製****示例:

for i in seq:

do_something_to(i)

實際工作方式:

複製****示例:

fetch = iter(seq)

while true:

try:

i = fetch.next()

except stopiteration:

break

do_something_to(i)

不過不需要改動你的**,因為 for 迴圈會自動呼叫迭代器的 next() 方法(以及監視stopiteration 異常)。

===字典===

字典和檔案是另外兩個可迭代的 python 資料型別。字典的迭代器會遍歷它的鍵(keys).

語句 for eachkey in mydict.keys() 可以縮寫為 for eachkey in mydict ,例如:

複製****示例:

>>> legends =

…>>> for eachlegend in legends:

… print 『name: %stoccupation: %s『 % eachlegend

… print 『 birth: %stdeath: %stalbum: %sn『

… % legends[eachlegend]

…name: freud occupation: psychoanalyst

birth: 1856 death: 1939 album: 1990

name: poe occupation: author

birth: 1809 death: 1849 album: 1976

name: gaudi occupation: architect

birth: 1852 death: 1906 album: 1987

另外,python 還引進了三個新的內建字典方法來定義迭代:

mydict.iterkeys() (通過 keys 迭代),mydict.itervalues() (通過 values 迭代),以及 mydicit.iteritems() (通過 key/value 對來迭代)。(www.jbxue.com 指令碼學堂 整理)

注意,in操作符也可以用於檢查字典的 key 是否存在,之前的布林表示式mydict.has_key(anykey) 可以被簡寫為 anykey in mydict。

===檔案===

檔案物件生成的迭代器會自動呼叫 readline() 方法。

這樣迴圈就可以訪問文字檔案的所有行。程式設計師可以使用 更簡單的 for eachline in myfile 替換 for eachline in myfile.readlines():

複製****示例:

>>>myfile=open(『config-win.txt』)

>>> for eachline in myfile:

… print eachline,# comma suppresses extra n

…[editorwindow]

font-name: courier new

font-size: 10

>>> myfile.close()

二,可變物件和迭代器

記住,在迭代可變物件的時候修改它們並不是個好主意。這在迭代器出現之前就是乙個問題。

乙個流行的例子就是迴圈列表的時候刪除滿足(或不滿足)特定條件的項:

複製****示例:

除列表外的其他序列都是不可變的,所以危險就發生在這裡。乙個序列的迭代器只是記錄你當前到達第多少個元素,所以如果你在迭代時改變了元素,更新會立即反映到你所迭代的條目上.在迭代字典的 key 時,你絕對不能改變這個字典。使用字典的 keys() 方法是可以的,因為keys() 返回乙個獨立於字典的列表。而迭代器是與實際物件繫結在一起的,它將不會繼續執行下去:

複製****示例:

>>> mydict =

>>> for eachkey in mydict:

… print eachkey,mydict[eachkey]

… del mydict[eachkey]

… a 1

traceback (most recent call last):

file 「」,line 1,in

runtimeerror: dictionary changed size during iteration

這樣可以避免有缺陷的**。更多有關迭代器的細節請參閱 pep 234 .

三,如何建立迭代器

對乙個物件呼叫 iter() 就可以得到它的迭代器。它的語法如下:

iter(obj)

iter(func,sentinel)

如果傳遞乙個引數給 iter() ,它會檢查你傳遞的是不是乙個序列,如果是,那麼很簡單: 

根據索引從 0 一直迭代到序列結束。另乙個建立迭代器的方法是使用類,將在第 13 章詳細介紹,乙個實現了 __iter__() 和 next() 方法的類可以作為迭代器使用.

如果是傳遞兩個引數給 iter() ,它會重複地呼叫 func ,直到迭代器的下個值等於sentinel。

您可能感興趣的文章:

python中enumerate函式遍歷元素例項教程

python版加密解密函式authcode的例子

與 python迭代器與iter()函式例項教程 有關的文章

python迭代器與iter()函式例項教程

python中迭代器和iter 函式

迭代器是在版本2.2被加入到python的,它為類序列物件提供了乙個類序列的介面。python的迭代無縫地支援序列物件,而且它還允許程式設計師迭代非序列型別,包括使用者定義的物件。迭代器用起來很靈巧,你可以迭代不是序列但表現處序列行為的物件,例如字典的鍵 乙個檔案的行,等等。當你使用迴圈迭代乙個物件...

python中迭代器和iter 函式

迭代器為類序列物件提供了乙個類序列的介面。python的迭代無縫地支援序列物件,而且它還允許程式設計師迭代非序列型別,包括使用者定義的物件。迭代器用起來很靈巧,你可以迭代不是序列但表現處序列行為的物件,例如字典的鍵 乙個檔案的行,等等。迭代器的作用如下 提供了刻擴充套件的迭代器介面 對列表迭代帶來了...

python中的iter迭代

具體解釋了怎麼用迭代,怎樣用迭代,怎樣轉換成迭代,可以看看 一 from collections.abc import iterable from collections.abc import iterator import time class person object def init sel...