1. 程式人生 > >Python學習之==>迭代器

Python學習之==>迭代器

一、概要

在瞭解Python的資料結構時,容器(container)、可迭代物件(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推導式(list,set,dict comprehension)眾多概念參雜在一起,難免讓人一頭霧水,下面這幅圖也許能讓大家更清楚的理解他們之間的關係。

 

二、容器(container)

容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用 in , not in 關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特列並不是所有的元素都放在記憶體)在Python中,常見的容器物件有:

  • list
  • dict
  • set
  • tuple
  • str

儘管絕大多數容器都提供了某種方式來獲取其中的每一個元素,但這並不是容器本身提供的能力,而是可迭代物件賦予了容器這種能力,當然並不是所有的容器都是可迭代的。

三、可迭代物件(iterable)

一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。很多容器都是可迭代物件(比如:list、dict、tuple等),此外,像開啟的檔案,也是可迭代物件。但凡可以返回一個迭代器的物件都可成為可迭代物件。

這裡x是一個list,是一個可迭代物件。我們知道,list、dict、set、tuple、str都是可迭代物件,通過iter()或__iter__(),就可以轉化為一個迭代器。所以,我們可以說:一個具有iter方法的物件就可以稱為可迭代物件。

四、迭代器(iterator)

上圖中,y和z就是兩個獨立的迭代器,它是通過iter()方法從可迭代物件轉化而來的。它是一個帶狀態的物件,該狀態用於記錄當前迭代所在的位置,以便下次迭代的時候取到正確的元素。它能在你呼叫 next() 方法的時候返回容器中的下一個值,任何實現了 __next__() 或next()方法的物件都是迭代器。迭代器有一種具體的迭代器型別,比如 list_iterator、set_iterator、tuple_iterator、str_iterator等 。

五、for迴圈的內部實現

在大多數情況下我們都不會用next()方法去可迭代物件中去取值,而是會用:for i in (iterable),如下圖:

for迴圈內部做了3件事情:

  1. 呼叫iter()把可迭代物件轉換成迭代器
  2. 不斷的呼叫迭代器的next()方法
  3. 處理StopIteration異常,結束迴圈

六、isinstance

可以使用isinstance()判斷一個物件是否是Iterator物件,如下:

 1 from collections import Iterator,Iterable
 2 l = [1,2,3,4,5]
 3 d = iter(l)
 4 print(isinstance(l,list))      # 判斷是否是list
 5 print(isinstance(l,Iterable))  # 判斷是否是可迭代物件
 6 print(isinstance(l,Iterator))  # 判斷是否是迭代器
 7 print(isinstance(d,Iterator))  # 判斷是否是迭代器
 8 # True
 9 # True
10 # False
11 # True