python三大神器之'叠代器'
叠代器:
1.認識叠代器
叠代器是訪問集合元素的一種方式。叠代器是一個可以記住遍歷的位置的對象。叠代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。叠代器只能往前不會後退。
我們怎樣才能判定一個對象是都是可以叠代的呢?
2.可叠代對象
list、tuple、str等類型的數據使用for...in...的循環語法從其中依次拿到數據進行使用,這類對象被稱為可叠代對象
3. 如何判斷一個對象是否是一個可叠代對象
可以使用 isinstance() 判斷一個對象是否是 Iterable 對象
from collections import Iterable # 使用isinstance() 函數檢測某個對象是否是一個可叠代的對象 # 列表是可叠代對象 result = isinstance([1,2], Iterable) print(result) # 元組是可叠代對象 result = isinstance((1,2), Iterable) print(result) # 字符串是可叠代對象 result = isinstance("hello", Iterable) print(result) # 字典是可叠代對象 result = isinstance({"a": 10, "b": 100}, Iterable) print(result) # 數字不是可叠代對象 result = isinstance(100, Iterable) print(result) # 定義類 class MyClass(object): pass # 創建對象 c1 = MyClass() # 對象c1不是可叠代對象 result = isinstance(c1, Iterable) print(result)
運行結果
True True True True False False
4.如何將一個不可叠代的對象轉換為可叠代對象:
在探討這個問題之前我們需要了解,可叠代對象的本質:可以向我們提供一個這樣的中間“人”即叠代器幫助我們對其進行叠代遍歷使用。而在python中內置的魔法方法__iter__()方法可以將一個對象轉換為可叠代對象,因此只要一個類中有__iter__()方法,那麽這個類實例出的對象就是個可叠代對象,接下來我們你驗證下:
from collections import Iterable # 使用isinstance() 函數檢測某個對象是否是一個可叠代的對象 class MyClass(object): # 可叠代對象的本質是,類中是否定義了 __iter__() 方法 def __iter__(self): return self c1 = MyClass() # 對象c1不是可叠代對象 result = isinstance(c1, Iterable) print(result)
運行結果
true
5.創建一個叠代器類
那麽上面的創建的叠代對象能用next()訪問嗎?結果肯定是不能的,我們雖然在類中定義了一個__iter__()方法,但我們並沒有定義一個函數去叠代這個類,這時我們需要用python的內置方法__next__()去叠代這個對象,接下來我們會分別創建一個叠代器和叠代對象去s驗證:
from collections import Iterable from collections import Iterator class StudentList(object): def __init__(self): # 創建列表 self.items = list() def addItem(self,item): # 追加元素到列表中 self.items.append(item) def __iter__(self): # 創建叠代器對象 studentIterator = StudentIterator(self.items) # 返回叠代器對象 return studentIterator # 定義叠代器 class StudentIterator(object): # 定義構造方法 # 1)完成 索引下標定義和初始化 # 2)接收要遍歷的列表值 def __init__(self, items): self.items = items self.current_index = 0 def __iter__(self): return self def __next__(self): # 判斷位置是否合法 if self.current_index < len(self.items): # 根據current_index 返回列表值 item = self.items[self.current_index] # 讓 下標+1 self.current_index += 1 # 返回元素內容 return item else: # 停止叠代 # 主動拋出異常,叠代器沒有更多的值(到了叠代器末尾) raise StopIteration # 實例化對象 stulist = StudentList() stulist.addItem("小明") stulist.addItem("小紅") stulist.addItem("小剛") # 檢查是否是可叠代對象 result = isinstance(stulist, Iterable) print(result) for value in stulist: print(value) image-20180704185515374
運行結果
小明 小紅 小剛
註意:如果我們用next()訪問的次數超過叠代對象的範圍會報錯,也許你會疑問為什麽平時我們遍歷列表,元組等可叠代對象時為什麽沒有這種情況,那是因為python內部在我們遍歷可叠代對象時超出範圍會自動停止,我們定義叠代器類時直接拋出錯誤了,沒有做那麽復雜的處理。
python三大神器之'叠代器'