Python中界逛,所有的集合都可以迭代。在語言內部中纺座,迭代器主要用于:
- for循環(huán)
- 構建和擴展集合類型
- 逐行遍歷文件文本
- 列表推導息拜,字典推導跟集合推導
- 元組拆包
- 調用函數(shù)時,用*拆包實參
序列可以迭代的原因: iter函數(shù)
解釋器需要迭代對象x時净响,會自動調用iter(x).
內置的iter函數(shù)有以下作用:
- 檢查對象是否實現(xiàn)了
__iter__
方法,如果實現(xiàn)了就調用它,獲取一個迭代器. - 如果沒有
__iter__
方法,尋找__getitem__
方法,嘗試按照順序(index為0開始)獲取元素. - 如果都沒有,python拋出TypeError異常.提示"x object is not iterable
. x為目標對象所屬的類. 在白鵝類型理論中,可迭代對象的定義更為簡單,實現(xiàn)了
iter方法即可.因為
abc.Iterable類實現(xiàn)了
subclasshook`方法少欺。
標準的迭代器接口有兩個方法
__next__
: 返回下一個可用的元素。如無馋贤,則拋出StopIteration異常赞别。在collections.abc.Iterator
抽象基類中定義。繼承自Iterable
類.
__iter__
: 返回self,以便在應該使用可迭代對象的地方使用迭代器配乓。例如for循環(huán)中仿滔。定義在Iterable
類中.
迭代器定義
迭代器是這樣的對象:實現(xiàn)了無參數(shù)的__next__
方法,返回序列中的下一個元素,如沒有元素了,就拋出StopIteration異常.
Python中的迭代器還實現(xiàn)了__iter__
方法,所有迭代器也可以迭代.
可迭代對象與迭代器的對比
python從可迭代對象中獲取迭代器。
要知道
- 可迭代對象有個
__iter__
方法犹芹,每次都實例化一個新的迭代器崎页; - 而迭代器要實現(xiàn)
__next__
方法,返回單個元素羽莺,還要實現(xiàn)__iter__
方法实昨,返回迭代器本身。
因此盐固,迭代器可以迭代荒给,但是可迭代對象不是迭代器。
兩個結論: - 可迭代的對象一定不能是自身的迭代器刁卜,也就是說志电,可迭代的對象必須實現(xiàn)
__iter__
方法,但不能實現(xiàn)__next__
方法 - 另一方面蛔趴,迭代器應該一直可以迭代挑辆,所有迭代器的
__iter__
方法應該返回自身。
生成器函數(shù)
生成器函數(shù)的工作原理
只要python函數(shù)的定義體中有yield關鍵字,該函數(shù)就是生成器函數(shù)鱼蝉。
生成器表達式
可以理解為列表推導的惰性版本洒嗤。是制造生成器的工廠。
何時使用生成器表達式
當生成器函數(shù)比較簡單時魁亦。
python中的自帶生成器函數(shù)渔隶。
- 用于過濾
- 用于映射
- 合并多個可迭代對象
- 用于重新排列元素的生成器函數(shù)
新語法 yield from
如果生成器函數(shù)需要產出另一個生成器生成的值,傳統(tǒng)方法是使用嵌套的for循環(huán).
yield from 其實就是代替了內部的for循環(huán).獲取到內部生成器產生的值
常用在協(xié)程上。
可迭代的歸約函數(shù)
深入分析iter函數(shù)
可以傳入兩個參數(shù)洁奈。第一個參數(shù)必須是可調用的對象间唉,用于不斷調(該對象沒有參數(shù)), 產出各個值,第二個值可以看做是個終止條件利术,當?shù)谝粋€參數(shù)對象調用返回改值時呈野。迭代器拋出StopIteration異常。停止迭代印叁。