1. 迭代器協議和for循環工做機制python
定義
1)迭代器協議是指:對象必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引發一個stopIteration異常,已終止迭代(只能日後不能往前退)。
2)可迭代對象:實現了迭代器協議的對象(如何實現:對象內部定義一個__iter__()方法)
3)協議是一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象。函數
for循環機制
for循環本質:循環全部對象,全都是使用迭代器協議
注:(字符串、列表、元組、字典、集合、文件對象)這些都不是可迭代對象,只不過在for循環,調用了他們內部的__iter__方法,把他們變成了可迭代對象
而後for循環調用可迭代對象的__next__方法去取值,並且for循環會捕捉StopIteration異常,以終止迭代工具
str = "hello" for i in str: print(i) iter_test = str.__iter__() print(iter_test) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) # print(iter_test.__next__()) l = [1, 2, 3] for i in l: # for循環實際上執行的就是這兩步:i_l = l.__inter__() i_l.__next__() print(i)
爲什麼要有for循環
序列類型 像列表、字符串等都有下標,用下標方式遍歷沒有問題,但若是是非序列類型的字典、集合、文件對象就不適用了。而for循環就是基於迭代器協議提供一個統一的可比遍歷全部對象的方法,在遍歷以前調用對象的__iter__()方法將其轉換成一個迭代器,而後適用迭代器協議去實現循環訪問,這樣全部的對象就能夠經過for循環來遍歷了。學習
next()函數:就至關於執行iter_l.__next__()spa
l=['die','erzi','sunzi','chongsunzi'] iter_l=l.__iter__() print(next(iter_l)) #next()--就至關於-->iter_l.__next__()
看視頻,作筆記,堅持學習code