什么是迭代器既琴?
簡單來講當(dāng)一個(gè)Python對象實(shí)現(xiàn)了iter方法或getitem方法與next方法活喊,那么它就是一個(gè)迭代器。
什么是可迭代對象绍赛?
只要對象實(shí)現(xiàn)了iter方法,那它就是一個(gè)可迭代對象辑畦。如果對象實(shí)現(xiàn)了getitem方法吗蚌,則會變成一個(gè)可迭代對象。也就是說航闺,迭代器一定是可迭代對象褪测,但是可迭代對象不一定是迭代器猴誊。
iter的作用:
當(dāng)解釋器開始迭代對象時(shí)潦刃,會先檢查對象是否實(shí)現(xiàn)了iter方法,如果實(shí)現(xiàn)了懈叹,就調(diào)用iter方法乖杠,返回當(dāng)前對象的迭代器類的實(shí)例,獲得一個(gè)迭代器澄成。
如果沒有實(shí)現(xiàn)iter方法胧洒,但是實(shí)現(xiàn)了getitem方法,python會創(chuàng)建一個(gè)迭代器墨状,嘗試按順序(從索引0開始)獲取元素卫漫。
如果都沒有實(shí)現(xiàn),python會拋出TypeError異常肾砂,通常會提示"object is not iterable" 列赎。
next的作用:
- 返回迭代器中的下一個(gè)可用元素
- 如果沒有元素,拋出StopIteration異常
- 可迭代的對象必須實(shí)現(xiàn)iter方法镐确,但不能實(shí)現(xiàn)next方法
通過方法判斷迭代器與可迭代對象:
isinstance()函數(shù)是用來判斷一個(gè)對象是否是一個(gè)已知的類型包吝。isinstance()與type() 區(qū)別是,isinstance()會考慮繼承關(guān)系源葫。所以說诗越,要判斷兩個(gè)類型是否相同推薦使用isinstance()。
collections.abc模塊定義了一些抽象基類息堂,它們可用于判斷一個(gè)具體類是否具有某一特定的接口嚷狞。結(jié)合isinstance()使用就可以判斷對象是否為迭代器或可迭代對象
# Iterable用于判斷對象是否為可迭代對象
# Iterator用于判斷對象是否為迭代器
from collections.abc import Iterable, Iterator
lst = [x for x in range(10)]
gen = (x for x in range(10))
print(isinstance(lst, Iterable))
# True
print(isinstance(lst, Iterator))
# False
print(isinstance(gen, Iterable))
# True
print(isinstance(gen, Iterator))
# True