迭代器
實現了迭代器協議的對象,稱為迭代器。
1 迭代器協議:
對象必須提供一個next方法,執行該方法要么返回迭代中的下一項,要么返回一個異常來終止本次迭代。(只能往前走,不能往后退!)
2 可迭代對象:
遵循了(實現了)迭代器協議的對象。(對象內部定義了一個__iter__()方法,以實現迭代器協議)
所以:列表、元組、字典、字符串等等的都不是可迭代對象,當用for循環遍歷的時候,其實for先去執行了l.__iter__()方法,將列表、
元組、字符串等變成一個可迭代的對象,在進行迭代。(__iter__()下有__next__()方法!)
3 可迭代對象和迭代器的關系
協議是一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象。
for 循環的本質:遍歷所有對象,全都是使用迭代器協議。
for 循環就是基於迭代器協議提供了一個統一的可以遍歷所有對象的方法,即在遍歷之前,先調用對象的__iter__方法將其轉換成一個迭代器,
然后使用迭代器協議去實現循環訪問,這樣所有的對象就都可以通過for循環來遍歷了,
列表,字符串,元組,字典,集合,文件對象等本質上來說都不是可迭代對象,在使用for循環的時候內部是先調用他們內部的_iter_方法,使
他們變成了可迭代對象,然后在使用可迭代對象的_next_方法依次循環元素,當元素循環完時,會觸發StopIteration異常,for循環會捕捉
到這種異常,終止迭代
生成器
生成器類似於一種數據類型,這種數據類型自動實現了迭代器協議(其他的數據類型需要調用自己內置的__iter__()方法),所以生成器就是可迭代對象
生成器分類及在python中的表現形式:(Python有兩種不同的方式提供生成器)
1、生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
2、生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表,按需取出對象
# 注意生成器 用()包裹起來
yield生成器函數
在函數中通過yield來返回值,那么這個函數返回的將是一個生成器對象,這個函數叫生成器函數
生成器表達式: