迭代
根據記錄的前面的元素的位置信息 去訪問後續的元素的過程 -遍歷可迭代對象 iterable
能夠使用for循環遍歷的對象
for item in obj: print(item)
isinstance(對象,類型) 判斷對象是否是 類型的實例對象
from collections import Iterable isinstance(obj, Iterable)
可迭代對象
可迭代對象通過iter方法提供一個 可以遍歷對象中數據的工具-迭代器
iter(可迭代對象) 可以獲取可迭代對象的迭代器通過迭代器可以迭代訪問 數據
next(迭代器) ===== 迭代器對象.next()
如果需要實現一個迭代器 就需要實現next()class MylistIter(object): ''' Mylist迭代器類 專門用來迭代訪問mylist中的數據''' def __init__(self,data): self.data = data # 記錄位置信息 self.index = 0 def __next__(self): ''' 迭代器 通過__next__方法提供迭代訪問數據的功能 內部會記錄相關的位置信息 next(迭代器對象) == 迭代器對象.__next__()''' # 先暫時把當前位置的數據存儲起來 if self.indef < len(self.data): data = self.data[self.index] self.index += 1 return data else: # 如果用戶已經訪問完成所有的數據了 應該拋出一個StopIteration異常 # for內部已經封裝了對 異常StopIteration的處理 # 當for內部接收異常的時候 就知道了應該是迭代完成 raise StopIteration # 對於迭代器來講 迭代器也是可迭代對象 iter(mylistiter) ==> mylisiter.__iter__() def __iter__(self): return self class Mylist(object): def __init__(self): self.data = [1,2,3,4,5] def __iter__(self): ''' 可迭代對象需要實現這個方法 可迭代對象的本質就是通過__iter__方法提供一個可以遍歷的數據的迭代器''' mliter = MyIister(self.data) return mliter # 創建一個對象 -實例對象 ml = Mylist() print(isinstance(ml, Iterable)) mliter = iter(ml) print(isinstance(mliter, Iterator)) for data in ml: print(data)
iter(ml) 等價於 ml.iter()
for循環遍歷可迭代對象的 過程模擬
1 iter(ml) == ml.iter() 獲取迭代器對象mylistiter<可以用以迭代訪問對象中存儲的數據>
2 next(mylistiter) == mylistiter.next() 獲取元素的值 並且將位置往後移動
3 第2步會一直執行下去 直到next()當中拋出StopIteration異常
for data in ml:
print(data)