python中迭代器的實現

  1. 迭代
    根據記錄的前面的元素的位置信息 去訪問後續的元素的過程 -遍歷

  2. 可迭代對象 iterable

    能夠使用for循環遍歷的對象

     for item in obj:
    
         print(item)
    

    isinstance(對象,類型) 判斷對象是否是 類型的實例對象

    from collections import Iterable
    isinstance(obj, Iterable)
    
  3. 可迭代對象

    可迭代對象通過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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章