07-06 迭代器

[TOC]

一 迭代器介紹

迭代器即用來迭代取值的工具,而迭代是重複反饋過程的活動,其目的通常是爲了逼近所需的目標或結果,每一次對過程的重複稱爲一次“迭代”,而每一次迭代得到的結果會作爲下一次迭代的初始值,單純的重複並不是迭代
07-06 迭代器

while True:
    msg = input('>>: ').strip()
    print(msg)

下述while循環纔是一個迭代過程,不僅滿足重複,而且以每次重新賦值後的index值作爲下一次循環中新的索引進行取值,反覆迭代,最終可以取盡列表中的值

goods=['mac','lenovo','acer','dell','sony']

index=0
while index < len(goods):
    print(goods[index])
    index+=1

插圖:惡搞圖43
07-06 迭代器

1.1 可迭代對象

通過索引的方式進行迭代取值,實現簡單,但僅適用於序列類型:字符串,列表,元組。對於沒有索引的字典、集合等非序列類型,必須找到一種不依賴索引來進行迭代取值的方式,這就用到了迭代器。

要想了解迭代器爲何物,必須事先搞清楚一個很重要的概念:可迭代對象(Iterable)。從語法形式上講,內置有__iter__方法的對象都是可迭代對象,字符串、列表、元組、字典、集合、打開的文件都是可迭代對象:

{'name':'egon'}.__iter__
{7,8,9}.__iter__
……

插圖:惡搞圖44
07-06 迭代器

1.2 迭代器對象

調用obj.iter()方法返回的結果就是一個迭代器對象(Iterator)。迭代器對象是內置有iternext方法的對象,打開的文件本身就是一個迭代器對象,執行迭代器對象.iter()方法得到的仍然是迭代器本身,而執行迭代器.next()方法就會計算出迭代器中的下一個值。 迭代器是Python提供的一種統一的、不依賴於索引的迭代取值方式,只要存在多個“值”,無論序列類型還是非序列類型都可以按照迭代器的方式取值

>>> s={1,2,3} # 可迭代對象s
>>> i=iter(s)  # 本質就是在調用s.__iter__(),返回s的迭代器對象i,
>>> next(i) # 本質就是在調用i.__next__()
1
>>> next(i)
2
>>> next(i)
3
>>> next(i)  #拋出StopIteration的異常,代表無值可取,迭代結束

插圖:惡搞圖45
07-06 迭代器

二 for循環原理

有了迭代器後,我們便可以不依賴索引迭代取值了,使用while循環的實現方式如下

goods=['mac','lenovo','acer','dell','sony']
i=iter(goods) #每次都需要重新獲取一個迭代器對象
while True:
    try:
        print(next(i))
    except StopIteration: #捕捉異常終止循環
        break

for循環又稱爲迭代循環,in後可以跟任意可迭代對象,上述while循環可以簡寫爲

goods=['mac','lenovo','acer','dell','sony']
for item in goods:   
    print(item)

for 循環在工作時,首先會調用可迭代對象goods內置的iter方法拿到一個迭代器對象,然後再調用該迭代器對象的next方法將取到的值賦給item,執行循環體完成一次循環,周而復始,直到捕捉StopIteration異常,結束迭代。

插圖:惡搞圖48
07-06 迭代器

三 迭代器的優缺點

基於索引的迭代取值,所有迭代的狀態都保存在了索引中,而基於迭代器實現迭代的方式不再需要索引,所有迭代的狀態就保存在迭代器中,然而這種處理方式優點與缺點並存:

3.1 優點:

1、爲序列和非序列類型提供了一種統一的迭代取值方式。

2、惰性計算:迭代器對象表示的是一個數據流,可以只在需要時纔去調用next來計算出一個值,就迭代器本身來說,同一時刻在內存中只有一個值,因而可以存放無限大的數據流,而對於其他容器類型,如列表,需要把所有的元素都存放於內存中,受內存大小的限制,可以存放的值的個數是有限的。

插圖:惡搞圖46
07-06 迭代器

3.2 缺點:

1、除非取盡,否則無法獲取迭代器的長度

2、只能取下一個值,不能回到開始,更像是‘一次性的’,迭代器產生後的唯一目標就是重複執行next方法直到值取盡,否則就會停留在某個位置,等待下一次調用next;若是要再次迭代同個對象,你只能重新調用iter方法去創建一個新的迭代器對象,如果有兩個或者多個循環使用同一個迭代器,必然只會有一個循環能取到值。

插圖:惡搞圖47
07-06 迭代器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章