python迭代 Python迭代和生成

2021-10-11 04:32:04 字數 2931 閱讀 9768

簡介在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...