迭代器


迭代器

一. 迭代器介紹

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

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

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

goods = ['mac','lennovo','acer','dell','sony']
index=0
while index<len(goods):
print(goods[index])
index += 1

1.1 可迭代對象

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

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

{'name':'momo'}.__iter__
{7,8,9}.__iter__
...

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的異常,代表無值可取,迭代結束

二. 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異常,結束迭代。

三. 迭代器的優缺點

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

3.1 優點:

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

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

3.2 缺點:

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM