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...