【前言】
在初級研發或測試面試中總會被問到什麼是python的迭代器,有什麼好處?這個看似很簡單的話題說起來似乎感覺自己並不是特別清楚的能講出來。所以本文記錄下自己查閱很多資料後的總結。
【什麼是迭代器】
迭代器是python最強大的功能之一,是訪問集合元素的一種方式
2.可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義乙個__iter__()方法)
3.協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件。
當我們看到這些概念的時候是不是覺得很抽象?那麼在搞清楚迭代器之前到底什麼是迭代?
迭代,顧名思義就是指乙個重複的過程,每一次重複都是基於上一次結果而來,迭代提供了一種通用的不依賴索引的迭代取值方式。我們可以把它理解為一種只能從前往後進行比遍歷的過程,但是可以進行多次遍歷,例如我們的for迴圈。
可迭代物件:在python中一切皆物件,那麼哪些是可迭代物件呢?其實很容易理解可以遍歷的物件例如:字串,list,tuple,dic,set等都屬於。如果我們無法判斷,就只需要記住在python中,但凡內部有__iter__方法的物件,都是可迭代物件。
(1) 檢視物件內部方法
使用dir()去判斷乙個物件有什麼方法,dir()會返回乙個列表,這個列表中含有該物件的以字串中的形式所有方法名,只需要檢視返回的方法中是否有__iter__方法,如何有則該物件為可迭代物件。
list1 = [1,2,3]
i = 100
print('__iter__' in dir(i)) # false
print('__iter__' in dir(list1)) # true
所以我們可以判斷乙個物件是不是可迭代物件可以通過判斷該物件是不是含有__iter__方法來判斷。
可迭代物件的優點:可以直觀檢視裡面的物件,如直接檢視列表的內容
可迭代物件缺點:1. 全部內容要載入至記憶體中,故占用記憶體;2. 可迭代物件不能迭代取值(除了索引,key外)
針對可迭代物件有人提出質疑,即使除去索引或者key以外,我們可以通過for迴圈進行取值,是的,通過for迴圈進行取值,其實for迴圈在底層做了乙個小小的轉換,就是先將可迭代物件轉換為迭代器,然後再進行取值。
那麼到底什麼是迭代器呢?
顧名思義就是可以迭代取值的工具。從專業的角度來說:迭代器就是實現了__next__方法,返回序列的下乙個元素,如果沒有元素了,就會丟擲stopiteration異常,python中的迭代器還實現了__iter__方法,因此迭代器也是可以迭代的。
所以簡單地說:在python中,內部含有__iter__方法並且含有__next__方法的物件就是迭代器。
如何判斷乙個物件是不是迭代器,通過dir方法檢視其是否具備iter和next方法,如下判斷str,list,tuple,dic和檔案哪個是迭代器
str1 = 'hello'
list1 = [1, 2, 3]
tup1 = (1, 2, 3)
dic1 =
f = open('file',encoding='utf-8', mode='w')
print('__iter__' in dir(str1)) # true
print('__iter__' in dir(list1)) # true
print('__iter__' in dir(tup1)) # true
print('__iter__' in dir(dic1)) # true
print('__iter__' in dir(f)) # true
print('__next__' in dir(str1)) # false
print('__next__' in dir(list1)) # false
print('__next__' in dir(tup1)) # false
print('__next__' in dir(dic1)) # false
print('__next__' in dir(f)) # true
f.close()
可以看出只有檔案物件是迭代器,其他物件均是可迭代物件。-------到這裡再去理解前面的概念容易多了呢
可迭代物件如何轉換為迭代器:
可以通過iter()方法或者可迭代物件.__iter__()方法將可迭代物件轉為迭代器
list1 = [1, 2, 3]
print(list1.__iter__())
print(iter(list1))
迭代器取值:
可迭代物件是不可以一直迭代取值的(除去索引,切片及key),但是轉換為迭代器就可以了,迭代器是利用__next__()進行取值。
list1 = [1,2,3]
obj = list1.__iter__() #或者通過iter(list1)轉換
#print(obj) #ret = obj.__next__()
print(ret)
1ret = obj.__next__()
print(ret)
2ret = obj.__next__()
print(ret)
3ret = obj.__next__() #stopiteration
traceback (most recent call last):
file "", line 1, in stopiteration
#迭代器利用next取值:乙個next取對應的乙個值,如果迭代器裡面的值取完了還要next那就報stopiteration錯誤
之前提到for迴圈的物件一定是可迭代物件,因為for迴圈的內部機制是:將可迭代物件轉換為迭代器,然後利用next進行取值,最後利用異常處理處理stopitreration。
使用while模擬for迴圈的內部機制:
list1 = [1, 2, 3, 4]
obj = iter(list1) #轉換位迭代器
while 1: # 利用while迴圈,next進行取值
try:
print(next(obj))
except stopiteration: # 利用異常處理終止迴圈
break
【總結】
在python中,內部含有'iter'方法並且含有'next'方法的物件就是迭代器
迭代器優點:
1. 提供了一種通用不依賴索引的迭代取值方式;
迭代器缺點:
1. 因為有next方法,即只能往後取值,不能往前,取值不如按照索引的方式靈活,不能取指定的某乙個值;
2. 無法**迭代器的長度。
什麼是迭代器,JS如何實現迭代器
1 迭代的定義 從乙個資料集合中按照一定的順序,不斷取出資料的過程稱為迭代 2 迭代和遍歷的區別 迭代 迭代強調的是依次取資料的過程,並不保證取多少,也不保證把所有的資料都取完 遍歷 遍歷強調的是要把整個資料依次全部取出 3 迭代器 對迭代過程的封裝,在不同的語言中有不同的表現形式,通常為物件 4 ...
什麼是迭代?
迭代是重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重複稱為一次 迭代 而每一次迭代得到的結果會作為下一次迭代的初始值。重複執行一系列運算步驟,從前面的量依次求出後面的量的過程。此過程的每一次結果,都是由對前一次所得結果施行相同的運算步驟得到的。例如利用迭代法求某一數學問題的...
什麼是迭代 可迭代物件 迭代器 生成器
迭代 python中可以用for迴圈使用取值操作過程.可迭代物件 可以使用for迴圈遍歷的物件,我們稱之為可迭代物件.迭代器 提供資料和記錄位置.生成器 如果函式中有yield我們稱之為生成器 如果在同一時間執行多個任務我們可以使用多程序和多執行緒,如果你想使用乙個執行緒或程序然後讓多個任務一次執行...