標籤:如何 數字 port 可迭代對象 依次 協助 初始化 for 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)
運行結果
TrueTrueTrueTrueFalseFalse
4.如何將一個不可迭代的對象轉換為可迭代對象:
在探討這個問題之前我們需要瞭解,可迭代對象的本質:可以向我們提供一個這樣的中間“人”即迭代器協助我們對其進行迭代遍曆使用。而在python中內建的魔法方法__iter__()方法可以將一個對象轉換為可迭代對象,因此只要一個類中有__iter__()方法,那麼這個類執行個體出的對象就是個可迭代對象,接下來我們你驗證下:
from collections import Iterable# 使用isinstance() 函數檢測某個對象是否是一個可迭代的對象class MyClass(object): # 可迭代對象的本質是,類中是否定義了 __iter__() 方法 def __iter__(self): return selfc1 = MyClass()# 對象c1不是可迭代對象result = isinstance(c1, Iterable)print(result)
運行結果
true
5.建立一個迭代器類
那麼上面的建立的迭代對象能用next()訪問嗎?結果肯定是不能的,我們雖然在類中定義了一個__iter__()方法,但我們並沒有定義一個函數去迭代這個類,這時我們需要用python的內建方法__next__()去迭代這個對象,接下來我們會分別建立一個迭代器和迭代對象去s驗證:
from collections import Iterablefrom collections import Iteratorclass 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三大神器之'迭代器'