首先說一下 Iterable 與 iterator的區別:
- Iterator 迭代器
- Iterable 可迭代對象
Iterable 凡是可以for循環的 都屬於 iterable 可迭代對象
Iterator 凡是可以next()的 都是iterator 迭代器
可迭代對象(iterble)並不一定是 迭代器(iterator)
迭代器(iterator)一定是可迭代對象(iterable)
from collections import Iterable,Iterator
xxx='abcdec' #字符串是可迭代對象
print isinstance(xxx,Iterable)
print isinstance(xxx,Iterator)
it_xxx = iter(xxx) #轉換爲迭代器
print isinstance(it_xxx,Iterable)
print isinstance(it_xxx,Iterator)
True
False
True
True
可以看到 字符串是可迭代對象,但並不是迭代器。迭代器一定是可迭代對象:
- Iter()與 __iter__ 則用於產生 iterator(迭代器),__iter__ 迭代器協議,凡是實現__iter__協議的對象,皆是迭代器對象。(next()也得實現,不然沒法產生數據)。
- Iter()迭代器工廠函數,凡是有定義有__iter__()函數,或者支持序列訪問協議,也就是定義有__getitem__()函數的對象 皆可以通過 iter()工廠函數 產生迭代器(iterable)對象。
from collections import Iterable,Iterator
class A(object):
def __init__(self,num):
self.num = num
self.start_num = -1
def __iter__(self):
return self
def next(self):
self.start_num += 1
if self.start_num > self.num:
raise StopIteration
return self.start_num
# iter()
b = [1,2,3]
it_b = iter(b)
print next(it_b)
print next(it_b)
# __iter__()
a = A(10)
print next(a)
print next(a)
print isinstance(it_b,Iterator)
print isinstance(a,Iterator)
#運行結果
1
2
0
1
True
True
True
由上可以看出來 iter()與iter()均產生迭代器,Iter()與__iter__ 則用於產生 iterator(迭代器)。
總體來說:
__iter__用於自定義用戶對象(類)
iter()用於支持序列訪問協議,也就是定義有__getitem__()函數的內置對象,以及實現了__getitem__()函數的用戶自定義對象。
iter()也可以用於 實現了 __iter__()的對象,不過既然已經實現了__Iter__(),那麼本身就是一個迭代器了,沒必要在iter()一下。
迭代器(Iterator):
GOF給出的定義爲:提供一種方法訪問一個容器(container)對象中各個元素,而又不需暴露該對象的內部細節。用於順序訪問集合對象的元素,不需要知道集合對象的底層表示。
迭代器是一種高層次的抽象接口,迭代器接口。一種統一的用於順序訪問集合對象中元素的標準,規範。