實現了迭代器協議的對象,稱爲迭代器。python
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有兩種不一樣的方式提供生成器)
一、生成器函數:常規函數定義,可是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每一個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
二、生成器表達式:相似於列表推導,可是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表,按需取出對象
# 注意生成器 用()包裹起來工具
yield生成器函數對象
在函數中經過yield來返回值,那麼這個函數返回的將是一個生成器對象,這個函數叫生成器函數blog
生成器表達式:字符串