python三大神器之'迭代器'

來源:互聯網
上載者:User

標籤:如何   數字   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三大神器之'迭代器'

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.