【筆記】Python基礎四
阿新 • • 發佈:2019-01-13
一,迭代器協議和for迴圈工作機制
(一),迭代器協議
1,迭代器協議:物件必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個stopiteration異常,以終止迭代(只能往後走,不能往前退)
2,可迭代物件:實現了迭代器協議的物件(如何實現,物件內嵌一個__iter__()方法)
3,協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件
(二),for迴圈工作機制
for迴圈的本質:迴圈所有物件,全都是使用迭代器協議
正本清源:(字串,列表,元組,字典,集合,檔案物件)這些都不是可迭代物件,只不過在for迴圈時,呼叫了他們內部的__iter__方法,把他們變成了可迭代物件。然後for迴圈呼叫可迭代物件的__next__方法去取值,而且for迴圈會捕捉Stopiteration異常,終止迭代。
例1,__next__()模擬for迴圈
l = [1,2,3] for i in l: #for迴圈遵循迭代器協議,先呼叫l.__iter__()將其轉換成一個迭代器,然後使用__next方法得到每一個值 print(i) #for迴圈模擬 x = 'hello' iter_test = x.__iter__() print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) '''輸出: h e l l o '''
例2,取列表的兩種方法
l = [1,2,3] #第一種:索引 print(l[0]) #輸出:l #索引遍歷 index = 0 while index < len(l): print(l[index]) index += 1 '''輸出: 1 2 3 ''' #第二種:__next__()方法 iter_l = l.__iter__() print(iter_l.__next__()) #輸出:l
(三)for迴圈存在的作用
序列型別:字串,列表,元組都有下標,可以使用索引訪問,但是非序列型別:字典,集合,檔案就不行。
for迴圈基於迭代器協議提供了一個統一的可以遍歷所有物件的方法。
#集合只能使用for迴圈 s = {'a','b','c'} for i in s: print(i) '''輸出: a c b ''' #for迴圈字典名時,取到的值是字典的key dic = {'aa':1,'bb':2} iter_d= dic.__iter__() print(iter_d.__next__()) #輸出:bb #使用for迴圈檔案控制代碼f的好處是:迭代器只在用的時候返回一個值,而不像readlines把所有內容都加在到記憶體裡 f = open('text.txt','r+') iter_f = f.__iter__() print(iter_f.__next__(),end='') print(iter_f.__next__(),end='') #輸出:1111 #輸出:2 #使用while語句模擬for迴圈 l=[1,2,3,4,5] diedai_l=l.__iter__() while True: try: print(diedai_l.__next__()) except StopIteration: print('迭代完畢了,迴圈終止了') break '''輸出: 1 2 3 4 5 迭代完畢了,迴圈終止了 ''' #內建方法next函式,就是在呼叫iter_l.__next__() l = ['die','erzi','sunzi','chongsunzi'] iter_l = l.__iter__() print(next(iter_l)) #輸出:die #迭代器就是可迭代物件,遵循迭代器協議就是可迭代物件 #怎樣把一個數據結構變成可迭代物件,就是呼叫__iter__()方法 #如果資料結構沒有__iter__()方法,就不是可迭代物件