Python入門知識簡述(六) 迭代器和生成器

2021-08-19 17:33:13 字數 1751 閱讀 5533

迭代意味著重複很多次,就像迴圈那樣。for迴圈能迴圈(迭代)序列和字典,但實際上也可迭代其他物件—實現方法iter的物件,這時,就需要用到迭代器。

迭代器是包含在乙個類裡面的,示例如下:

_metaclass_=type

classdiedaiqi:

value=0

def _next_(self):

self.value+=1

if self.value>10:

raise stopiteration

return self.value

def _iter_(self):

return self

ti =diedaiqi()

list(ti)

這是乙個簡單的迭代器,使用這個迭代器可以用來建立乙個包含從1到10的整數列表,實際上也就是迴圈了10次,每次得到乙個數。

ps:使用迭代器的最主要原因,是它比列表更簡單優雅,更方便。此外,還可以藉此用來建立乙個生成器。生成器是一種使用普通函式語法定義的迭代器。生成器實際上更方便了人們編寫**,但實際上無論任何**,都可以不使用生成器。

對生成器而言,最特殊的地方在於yield語句,只要包含yield語句的函式都被稱為生成器。但其行為與腹痛函式截然不同。區別在於,生成器不是使用return返回乙個值,而是可以生成多個值,每次乙個。

shengchegnqi(nested):

for diyiceng in nested:

for dierceng in diyiceng:

yield dierceng

nested=[[1,2],[3,4],5]

for i in shenghcengqi (nested):

print(i)

高亮部分為編寫的乙個生成器,下面是想要實現的功能,即列印出這些值,為了列印出這些值,使用了迭代的思想。這也就是說,為什麼生成器與迭代器聯絡緊密。

def flatten(nested):

try:

try:nested + ''

except typeerror:

pass

else:

raise typeerror

for sublist in nested:

for element in flatten(sublist):

yield element

except typeerror:

yield nested

print(list(flatten([『foo』,[『bar』,[『baz』]]])))

上述**是乙個遞迴式生成器,可以使用多層巢狀,且無論物件是什麼型別,都可以引發typeerror異常,即可以迭代。

事實上,生成器是包含關鍵字yield的函式,但被呼叫時不會執行函式體內的**,而是返回乙個迭代器。每次請求值時都將執行生成器的**,知道遇到yield或return。

簡而言之,生成器由兩個單獨的部分組成:生成器的函式生成器的迭代器生成器由def語句定義,包含yield語句,而迭代器用來返回結果。

Python入門(六) 迭代

1 迭代的概念 在python中,如果給定乙個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們成為迭代 iteration 在python中,迭代是通過 for in 來完成的。迭代操作就是對於乙個集合,無論該集合是有序 還是無序,我們用 for 迴圈總是可以...

簡述Python迭代器

物件必須提供乙個next方法,執行方法要麼返回迭代器的下一項,要麼就引起乙個stopiteration異常,以終止迭代。協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具 如for迴圈,sum min max函式等 使用迭代器協議訪問物件。實現了迭代器協議的物件叫可迭代物件,滿足以下...

Python快速入門 簡述

web應用開發 作業系統管理 伺服器維護的自動化指令碼 科學計算 桌面軟體 伺服器軟體 網路軟體 遊戲構思實現,產品早期原型和迭代 1 print函式代替print語句 python 2.x print 3,4 3,4 python 3.x print 3,4 3 42 python 3.x預設使用...