1. 程式人生 > 資訊 >上週 47 顆星鏈上天后,SpaceX 再次發射 48 顆衛星

上週 47 顆星鏈上天后,SpaceX 再次發射 48 顆衛星

一、什麼是迭代器

我是這樣理解:如果你的某個物件可以用for迴圈去遍歷出裡面的所有的值,那麼他就可以作為迭代器。當然你也可以使用collections庫裡面的Iterable,使用isinstance([],Iterable)判斷該物件是否是迭代,程式碼放在下端

from collections import Iterable
# 輸出true為可迭代,false為不可迭代物件
print(isinstance([], Iterable))

二、可迭代物件的本質

分析:對可迭代物件進行迭代使用的過程,每迭代一次(即在for...in...中每迴圈一次)都會返回物件中的下一條資料,一直向後讀取資料直到迭代了所有資料後結束。那麼,在這個過程中就應該有一個“人”去記錄每次訪問到了第幾條資料,以便每次迭代都可以返回下一條資料。我們把這個能幫助我們進行資料迭代的“人”稱為迭代器(Iterator)。

三、類中如何實現迭代器

首先我們要理解迭代器,迭代器就是能夠使用迴圈的方式,獲取你物件中的所有值。例如再python中list、tuple、str型別都可以稱為可迭代物件。可迭代對過程其實也很簡單,我們用list舉個栗子。

# 建立一個物件
lists = list[1,2,3,4,5,6]
# 建立一個索引值
index = 0
# 遍歷物件內的所有制,被稱為迭代過程
while True:
    print(list[index])
    index += 1

  那麼如果在類中我們是否可以這樣實現

from collections import Iterable
class TestIterable:
    def __init__(self):
        self.lists = [1, 2, 3, 4, 5, 6]
        self.index = -1
    def __iter__(self):
        return self
def __next__(self):
    self.index +=1
    if self.index < len(self.lists):
        return self.lists[self.index]
    else:
        raise StopIteration

s = TestIterable()
print(isinstance(s,Iterable))
for i in s:
print(i)

現在開始解釋為什麼要這樣實現。首先在迭代器使用過程中,類的方法裡面有預設的魔術方法 __iter__和__next__兩種。

  __iter__表示讓物件變為可迭代物件,然後他的返回值要是一個迭代器,你自身擁有__iter__方法。所以他就是一個迭代器,我們只需要返回他自身即可。

  __next__物件是對訪問物件的值,每次迭代過程都會獲取__next__的值。所以我們把需要迭代的值,用index去控制他的索引位置。那麼我們就可以是這個類變為可迭代的物件。當然你也可以試過之後嘗試,使用__next__返回其他的類,這樣或有意想不到的結果。最後萬物皆物件。