遞歸和迭代的區別
遞歸是內部指針等待的一個過程,需要一直嵌套得到結果,而迭代是遍歷的過程,前面的過程結束后可以進行下一項,不需要等待
迭代器協議和for循環機制
對象必須提供一個next方法,執行這個方法要么返回迭代中的下一項,要么就引起一個stopiteration異常終止迭代(只能向后進行,不能向前)
可迭代對象,是實現了迭代器協議的對象,通過對象內部定義一個__iter__()方法
協議是一種約定,可迭代對象實現協議,那么就可以用迭代器協議訪問了,python內部工具for , sum min max 函數
但是字符串、列表、元組、集合、文件對象 這些都不是可迭代對象,只不過在for循環的作用下,for調用了他們內部的__iter__方法,把他們變成了可迭代對象
a = 'hello' b = a.__iter__() #生成了一個b的迭代器對象地址 print(b.__next__()) #取值直到報錯
for循環實際上實現了__iter__()方法生成了一個迭代器對象,然后一步步next 直到報錯並返回 , 是一個完整的過程
對於序列如此,對於字典和文件等也是如此,統一生成迭代器來循環
所以,凡是能被for循環的對象內部都有一個__iter__()方法
for i in file: 所以讀取文件用for,文件生成迭代器是一行行讀,前面讀完的行內存就回收掉了,不占用內存
next()內置函數實際上就是實現對象內部的__next__()方法,效果一樣