1. 程式人生 > >python三大神器之'叠代器'

python三大神器之'叠代器'

次數 接收 依次 pan class 可叠代對象 認識 index urn

叠代器:

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三大神器之'叠代器'