1. 程式人生 > >python中的迭代器

python中的迭代器

迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的物件。迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

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

2. 判斷是否可以迭代
可以使用 isinstance() 判斷一個物件是否是 Iterable 物件:

In [50]: from collections import Iterable
In [51]: isinstance([], Iterable)
Out[51]: True
In [52]: isinstance({}, Iterable)
Out[52]: True
In [53]: isinstance('abc', Iterable)
Out[53]: True
In [54]: isinstance((x for x in range(10)), Iterable)
Out[54]: True
In [55]: isinstance(100, Iterable)
Out[55]: False

而生成器不但可以作用於 for 迴圈,還可以被 next() 函式不斷呼叫並返回下一個值,直到最後丟擲 StopIteration 錯誤表示無法繼續返回下一個值了。

3.迭代器
可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
可以使用 isinstance() 判斷一個物件是否是 Iterator 物件:

In [56]: from collections import Iterator
In [57]: isinstance((x for x in range(10)), Iterator)
Out[57]: True
In [58]: isinstance([], Iterator)
Out[58]: False
In [59]: isinstance({}, Iterator)
Out[59]: False
In [60]: isinstance('abc', Iterator)
Out[60]: False
In [61]: isinstance(100, Iterator)
Out[61]: False

4.iter()函式
生成器都是 Iterator 物件,但 list 、 dict 、 str 雖然是 Iterable ,卻不是Iterator 。

把 list 、 dict 、 str 等 Iterable 變成 Iterator 可以使用iter() 函式:

In [62]: isinstance(iter([]), Iterator)
Out[62]: True
In [63]: isinstance(iter('abc'), Iterator)
Out[63]: True

總結
凡是可作用於 for 迴圈的物件都是 Iterable 型別;
凡是可作用於 next() 函式的物件都是 Iterator 型別;
集合資料型別如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函式獲得⼀個 Iterator 物件。