簡介在python中存在一種名叫迭代器的容器物件。顧名思義,這種物件能夠產生迭代的數值,在許多場合中,比如在機器學習領域,要從乙個迭代器裡不斷地提取樣本資料進行訓練。而生成器也是一種迭代器,因此在本文中將詳細介紹迭代器的知識。
迭代器定義
迭代器也稱為游標,形象地理解為程式執行到**就在該處做個標記,下次程式從該處繼續執行。通過迭代器的方法可以將迭代器中的元素一一提取出來,那麼迭代器本身是什麼呢?這就要先講到可迭代物件了。
可迭代物件
可迭代物件並不是迭代器,但是可以通過iter()函式將可迭代物件轉換成迭代器。一般來說,可以使用for迴圈遍歷的物件稱為可迭代物件,那我們自然就能想到一些常見的可迭代物件了:
列表;元組;
字串;
字典;檔案。
我們可以將以上可迭代物件轉換成迭代器,而迭代器本身就是乙個迭代器物件。
>>>a = iter('finthon')
>>>a
>>>a=iter('finthon')
>>>a
迭代器方法
這裡主要介紹讀取迭代器元素的方法,一般通過next()函式或者__next__()方法實現。
例如我們想讀取上面構建的迭代器a,可以這樣操作:
>>>next(a)
'f'>>>next(a)
'i'#或者使用__next__()方法
>>>a.__next__()
'n'>>>a.__next__()
't'>>>a.__next__()
'h'>>>a.__next__()
'o'>>>a.__next__()
'n'>>>a.__next__()
traceback (most recent call last):
file "", line 1, in
a.__next__()
stopiteration
>>>next(a)
'f'>>>next(a)
'i'#或者使用__next__()方法
>>>a.__next__()
'n'>>>a.__next__()
't'>>>a.__next__()
'h'>>>a.__next__()
'o'>>>a.__next__()
'n'>>>a.__next__()
traceback(mostrecentcalllast):
file"",line1,in
a.__next__()
stopiteration
依次從迭代器a中取出了其中的元素,當迭代器取完元素後就空了,此時再想取出元素就會引發停止迭代的異常stopiteration。
生成器定義
生成器也是一種迭代器,因此next()函式和__next__()方法也可以在生成器中使用。有兩種方法構建生成器:
通過yield關鍵字實現;
通過生成器表示式實現。
yield關鍵字在函式中使用,返回函式的值並在此做好標記,下次從標記處繼續呼叫該函式,返回函式的值。首先來看個例子:
def finthon():
yield 2
yield 5
yield 'hello'
deffinthon():
yield2
yield5
yield'hello'
>>>x = finthon()
>>>x
>>>x=finthon()
>>>x
通過將函式賦值給變數x,建立了乙個生成器x,接下來我們呼叫這個生成器:
>>>next(x)
>>>next(x)
>>>next(x)
'hello'
>>>next(x)
>>>next(x)
>>>next(x)
'hello'
可以看出yield語句的作用是返回對應的值給函式,標記此處並暫時把該函式掛起,當使用next()函式時,將繼續執行標記處後面的語句。
生成器表示式
這是另一種構建生成器的方法,通過以下格式:
生成器名 = (i for i in ***)
生成器名=(iforiin***)
其中***是乙個可迭代物件,注意用()包含,語句的意思是先對***進行for迴圈,每次取出i後進行i的運算,這裡直接返回i,舉個例子:
>>>a = (i * 2 for i in range(3))
>>>a
at 0x000001d7db5fe468>
>>>a=(i*2foriinrange(3))
>>>a
at0x000001d7db5fe468>
可以看出此時構建了乙個生成器a,它是乙個包含i * 2的值,我們可以繼續呼叫其中的元素:
>>>next(a)
>>>next(a)
>>>next(a)
>>>next(a)
>>>next(a)
>>>next(a)
需要特別強調的是這種格式與列表解析非常類似,列表解析返回的是乙個列表,格式如下:
列表名 = [i for i in ***]
列表名=[iforiin***]
這種格式與生成器唯一的不同就是使用,一定不能使用錯了:
>>>a = [i * 2 for i in range(3)]
>>>a
[0, 2, 4]
>>>a=[i*2foriinrange(3)]
>>>a
[0,2,4]
可見返回的a是乙個列表,如果要變成迭代器就要使用iter()函式轉換一下。
總結我們在這裡具體介紹了迭代器以及迭代器中的生成器,通過next()函式或__next__()方法呼叫內部元素,通過iter()函式能夠將可迭代物件轉換成迭代器。最後可以使用yield關鍵字和生成器表示式兩種方法構建生成器。學習完本文,以後我們就可以構建一些自定義的迭代器完成指定任務了。
python迭代器的作用 python的迭代器
迭代是指能夠從序列中訪問出素的一種方式,在我們遍歷使用for.in.的物件都是可迭代物件。這裡需要補充一點的是python中一切都是物件。判斷乙個物件是否是可迭代物件可以通過instance函式 像我們常用的列表,字典,字串,集合,元組都是可迭代物件。那麼我們是否可以自定義乙個可迭代物件呢,答案是肯...
python迭代器作用 python中的迭代器
python中有一類工具叫做迭代工具,它能從左至右掃瞄物件。這包括了for迴圈 列表解析 in成員關係測試以及map內建函式等。可以用在上述迭代工具環境中,通過一次次迭代不斷產生結果的物件稱為可迭代物件,即是iterable。實際上可迭代物件分為兩大類,一種是實際儲存的序列,即列表 元組,字串 另一...
python的迭代 在Python中停止迭代
我對編碼相對比較陌生,當我在某個網頁上時,我使得此程式重複滑鼠筆畫,以便可以自動執行此過程。在python中停止迭代 import pyautogui,time inp raw input number input?iterations raw input iterations?def move x...