1. 程式人生 > >python的迭代器

python的迭代器

一 迭代的概念

迭代是Python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是一個可以記住遍歷的位置的物件。

迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter()next()

字串,列表或元組物件都可用於建立迭代器:

#迭代器即迭代的工具,那什麼是迭代呢?
#迭代是一個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值
while True: #只是單純地重複,因而不是迭代
    print('===>') 
    
l=[1,2,3]
count
=0 while count < len(l): #迭代 print(l[count]) count+=1

二 為何要有迭代器?什麼是可迭代物件?什麼是迭代器物件?

#1、為何要有迭代器?
對於序列型別:字串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器

#2、什麼是可迭代物件?
可迭代物件指的是內建有__iter__方法的物件,即obj.__iter__,如下
'hello'.__iter__
(1,2,3).__iter__
[1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ #3、什麼是迭代器物件? 可迭代物件執行obj.__iter__()得到的結果就是迭代器物件 而迭代器物件指的是即內建有__iter__又內建有__next__方法的物件 檔案型別是迭代器物件 open('a.txt').__iter__() open('a.txt').__next__() #4、注意: 迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件

三 迭代器物件的使用

dic={'
a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器物件,迭代器物件即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同於next(iter_dic) print(iter_dic.__next__()) #等同於next(iter_dic) print(iter_dic.__next__()) #等同於next(iter_dic) # print(iter_dic.__next__()) #丟擲異常StopIteration,或者說結束標誌 #有了迭代器,我們就可以不依賴索引迭代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break #這麼寫太醜陋了,需要我們自己捕捉異常,控制next,python這麼牛逼,能不能幫我解決呢?能,請看for迴圈

四 for迴圈

#基於for迴圈,我們可以完全不再依賴索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])

#for迴圈的工作原理
#1:執行in後物件的dic.__iter__()方法,得到一個迭代器物件iter_dic
#2: 執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體程式碼
#3: 重複過程2,直到捕捉到異常StopIteration,結束迴圈

五 迭代器的優缺點

#優點:
  - 提供一種統一的、不依賴於索引的迭代方式
  - 惰性計算,節省記憶體
#缺點:
  - 無法獲取長度(只有在next完畢才知道到底有幾個值)
  - 一次性的,只能往後走,不能往前退

說明:

  for迴圈可用於任何可迭代物件

  for迴圈開始時,會通過迭代協議傳輸給iter()內建函式,從而能夠從迭代物件中獲得一個迭代器,返回的物件含有需要的next()方法。