首先說(shuō)一下 Iterable 與 iterator的區(qū)別
Iterator 迭代器
Iterable 可迭代對(duì)象
Iterable 凡是可以for循環(huán)的 都屬于 iterable 可迭代對(duì)象
Iterator 凡是可以next()的 都是iterator 迭代器
可迭代對(duì)象(iterble)并不一定是 迭代器(iterator)
迭代器(iterator)一定是可迭代對(duì)象(iterable)
fromcollectionsimportIterable,Iterator
xxx='abcdec' #字符串是可迭代對(duì)象
print isinstance(xxx,Iterable)
print isinstance(xxx,Iterator)
it_xxx = iter(xxx) #轉(zhuǎn)換為迭代器
print isinstance(it_xxx,Iterable)
print isinstance(it_xxx,Iterator)
True
False
True
True
可以看到 字符串是可迭代對(duì)象业舍,但并不是迭代器
迭代器一定是可迭代對(duì)象
Iter()與 __iter__ 則用于產(chǎn)生 iterator(迭代器)
__iter__ 迭代器協(xié)議
凡是實(shí)現(xiàn)__iter__協(xié)議的對(duì)象措译,皆是迭代器對(duì)象。(next()也得實(shí)現(xiàn)蜈彼,不然沒(méi)法產(chǎn)生數(shù)據(jù))
Iter()迭代器工廠函數(shù)
凡是有定義有__iter__()函數(shù),或者支持序列訪問(wèn)協(xié)議,也就是定義有__getitem__()函數(shù)的對(duì)象 皆可以通過(guò) iter()工廠函數(shù) 產(chǎn)生迭代器(iterable)對(duì)象
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)
#運(yùn)行結(jié)果
1
2
0
1
True
True
由上可以看出來(lái) iter()與iter()均產(chǎn)生迭代器。
Iter()與__iter__ 則用于產(chǎn)生 iterator(迭代器)
總體來(lái)說(shuō)
__iter__用于自定義用戶對(duì)象(類(lèi))
iter()用于支持序列訪問(wèn)協(xié)議注簿,也就是定義有__getitem__()函數(shù)的內(nèi)置對(duì)象,以及實(shí)現(xiàn)了__getitem__()函數(shù)的 用戶自定義對(duì)象跳仿。
iter()也可以用于 實(shí)現(xiàn)了 __iter__()的對(duì)象滩援,不過(guò)既然已經(jīng)實(shí)現(xiàn)了__Iter__(),那么本身就是一個(gè)迭代器了塔嬉,沒(méi)必要在iter()一下。
迭代器(Iterator):
GOF給出的定義為:提供一種方法訪問(wèn)一個(gè)容器(container)對(duì)象中各個(gè)元素租悄,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)谨究。用于順序訪問(wèn)集合對(duì)象的元素,不需要知道集合對(duì)象的底層表示泣棋。
迭代器是一種高層次的抽象接口胶哲,迭代器接口。一種統(tǒng)一的用于順序訪問(wèn)集合對(duì)象中元素的標(biāo)準(zhǔn)潭辈,規(guī)范鸯屿。