python iter()與 __iter__()的區別

首先說一下 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

可以看到 字符串是可迭代對象,但並不是迭代器。迭代器一定是可迭代對象:

  1. Iter()與 __iter__ 則用於產生 iterator(迭代器),__iter__ 迭代器協議,凡是實現__iter__協議的對象,皆是迭代器對象。(next()也得實現,不然沒法產生數據)。
  2. 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)對象中各個元素,而又不需暴露該對象的內部細節。用於順序訪問集合對象的元素,不需要知道集合對象的底層表示。
  迭代器是一種高層次的抽象接口,迭代器接口。一種統一的用於順序訪問集合對象中元素的標準,規範。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章