Python基礎 07迭代器

2022-07-03 16:00:25 字數 2857 閱讀 7847

迭代器是在版本 2.2 被加入python 的,它為類序列物件提供了乙個類序列的介面。python 的迭代無縫地支援序列物件,而且它還允許迭代非序列型別,包括使用者定義的物件。它的出現,對列表迭代、字典迭代帶來了效能上的增強。

迭代器用起來很靈巧,可以迭代不是序列但表現出序列行為的物件,例如字典的 key ,乙個檔案的行,等等。當你使用迴圈迭代乙個物件條目時,你幾乎不可能分辨出它是迭代器還是序列。

根本上說,迭代器就是乙個實現了 next() 方法的物件,當你需要下乙個項時(或在乙個像for語句這樣的迴圈機制中),呼叫迭代器的 next() 方法就可以獲得它。條目全部取出後,會引發乙個 stopiteration異常,這並不表示錯誤發生,只是告訴外部呼叫者,迭代完成。

不過,迭代器也有一些限制。例如你不能向後移動,不能回到開始,也不能複製乙個迭代器。如果要再次(或者是同時)迭代同個物件,你只能去建立另乙個迭代器物件。

簡單實用迭代器的例子如下:

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

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

mydict.iterkeys() (通過 keys 迭代),

mydict.itervalues() (通過 values 迭代),

mydicit.iteritems() (通過 key/value 對來迭代)。

檔案物件生成的迭代器會自動呼叫 readline() 方法。這樣,迴圈就可以訪問文字檔案的所有行。可以使用更簡單的for eachline in myfile 替換 for eachline in myfile.readlines()。

記住,在迭代可變物件的時候修改它們不是個好主意,比如在迭代字典的 key 時,你絕對不能改變這個字典。

>>> mydict = 

>>> for eachkey in

mydict:

...

print

eachkey, mydict[eachkey]

...

delmydict[eachkey]

...a 1traceback (most recent call last):

file

"",line 1,in

?runtimeerror:dictionary changed size during iteration

使用字典的 keys() 方法是可以的,因為keys()返回乙個獨立於字典的列表:

>>> for eachkey in

mydict.keys():

...

print

eachkey, mydict[eachkey]

...

delmydict[eachkey]

...c 3b 2d 4

>>>mydict

{}

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

iter(obj)

iter(func,  sentinel)

如果傳遞乙個引數給 iter() ,它會檢查你傳遞的是不是乙個序列,如果是,那麼很簡單:根據索引從 0 一直迭代到序列結束。另乙個建立迭代器的方法是使用類:乙個實現了__iter__() 和 next() 方法的類可以作為迭代器使用。

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

>>> def

fun():

...

return 1...

>>> myiter = iter(fun, 2)

>>>myiter.next()

1>>> for i in

myiter:

...

printi1

1111......(死迴圈)

reversed() 內建函式將返回乙個反序訪問的迭代器。enumerate() 內建函式同樣也返回迭代器。另外兩個新的內建函式any() 和 all(),在 python 2.5 中新增,如果迭代器中某個/所有條目的值都為布林真時,則它們返回值為真。

Python基礎 迭代器

二 生成器 三 推導表示式 迭代器就是乙個容器,將可迭代物件通過iter包起來 li 1 2,3 4,5 a liter li 迭代器print next a 1print next a 2print next a 3 乙個個取值 1.訪問者不需要去關心內部結構,只需要通過next不斷去取下乙個內容...

Python基礎 迭代器

可以直接作用於for迴圈的資料型別有一下幾種 一類是集合資料型別 如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 這些可以直接作用與for迴圈的物件統稱為可迭代物件 iterable 可以使用isinsta...

python基礎 迭代器

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable。可以使用...