python進階——疊代器
那麼什麼是疊代呢?
對對象中的某個元素重複做同樣的事情就是疊代了,最簡單的最常用的就是疊代一個清單了,也就是說對它的每個元素進行一個一個處理或者另行計算的過程就叫做疊代:
myList = [1,2,3,4,5]
for i in myList:
print(i)
哪些對象是可以被疊代的呢?
一般可以被疊代的對象都是有序了,也是說你要知道誰是第一個,誰是第二個……誰是最後一個,或者說你要知道誰是下一個,下一個這個概念可能更為關鍵或者說更需要被了解一下。
- 在
中可以被疊代的對象:有序的:list,tuple,string,無序:set,dict(無法控制周遊順序)python
怎麼判斷一個對象能否被疊代呢?
可以使用
isinstance()
判斷一個對象是否是
Iterable
對象:
from collections.abc import Iterable
myList = list(range(1,6)) # 清單
print(isinstance(myList, Iterable)) # True
mySet = set(range(1,6)) # 集合
print(isinstance(mySet, Iterable)) # True
print(isinstance(123, Iterable)) # False
現在說回什麼是疊代器?
疊代器可以看作是一個特殊的對象,每次調用該對象時會傳回自身的下一個元素,從實作上來看,一個疊代器對象必須是定義了
__iter__
方法和
__next__
方法的對象。在
python
因為有
for
循環的強大功能,疊代器的功能已經有點弱化了,很少有機會自己定義一個疊代器,然後疊代使用。
- 清單list、元組tuple、集合set、字典dict等都是可被疊代(Iterable)的對象,但并不是疊代器(Iterator),可用使用
函數将其變為疊代器。iter()
myList = list(range(1,6))
# 非疊代器
print(isinstance(myList, Iterator)) # False
# 疊代器
print(isinstance(iter(myList), Iterator)) # True
Python
中疊代器Iterator對象表示的是一個資料流,
Iterator
對象可被
next()
函數調用,并且傳回疊代器中下一個元素,直到沒有資料時抛出
StopIteration
異常,可以認為這個對象是未知長度的資料流,隻有通過
next()
函數得到下一個資料,是以疊代器的計算是
惰性
的,隻有需要獲得下一個資料時,才被計算。
其實for循環的本質就是不斷調用next()實作的:
myList = list(range(1,6))
for i in myList:
print(i)
上下兩方法等價:
myIt = iter(myList)
while True:
try:
print(next(myIt))
except StopIteration:
break
主要需要了解的的是如何拿到疊代器(使用
iter()
函數)以及對疊代器的使用(調用
next()
函數和對
stopIteration
異常的捕獲)。