Python3 可迭代物件 迭代器與生成器

2021-09-11 05:23:03 字數 4583 閱讀 3317

提問:

from collections import iterator,generator

a =(a*

2for a in

range(10

))print

(isinstance

(a, iterator)

)# true

print

(isinstance

(a, generator)

)# true

序列可以迭代的原因:bifiter()函式。直譯器需要迭代物件 x 時,會自動呼叫iter(x)。內建的 iter 函式有以下作用:

(1) 檢查物件是否實現了__iter__()方法,如果實現了就呼叫它,返回乙個特殊的迭代器物件, 這個迭代器物件實現了__next__()方法並通過 stopiteration 異常標識迭代的完成

(2) 如果沒有實現__iter__()方法,但是實現了__getitem()__方法,而且其引數是從零開始的索引,python 會建立乙個迭代器,嘗試按順序(從索引 0 開始)獲取元素。

(3) 如果前面兩步都失敗,python 丟擲 typeerror 異常,通常會提示「c objectis not iterable」(c 物件不可迭代),其中 c 是目標物件所屬的類。

迭代是python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是乙個可以記住遍歷的位置的物件。

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。

迭代器有兩個基本的方法:__iter__()__next__()

字串,列表或元組物件都可用於建立迭代器:

>>

>

list=[

1,2,

3,4]

>>

> it =

iter

(list

)# 建立迭代器物件

>>

>

print

(next

(it)

)# 輸出迭代器的下乙個元素

1>>

>

print

(next

(it))2

>>

>

迭代器物件可以使用常規for語句進行遍歷:

#!/usr/bin/python3

list=[

1,2,

3,4]

it =

iter

(list

)# 建立迭代器物件

for x in it:

print

(x, end=

" ")

也可以使用 next() 函式:

#!/usr/bin/python3

import sys # 引入 sys 模組

list=[

1,2,

3,4]

it =

iter

(list

)# 建立迭代器物件

while

true

:try

:print

(next

(it)

)except stopiteration:

sys.exit(

)

把乙個類作為乙個迭代器使用需要在類中實現兩個方法__iter__()__next__()

如果你已經了解的物件導向程式設計,就知道類都有乙個建構函式,python 的建構函式為__init__(), 它會在物件初始化的時候執行。

__iter__()方法返回 self,以便在應該使用可迭代物件的地方使用迭代器,例如在 for 迴圈中。

__next__()方法(python 2 裡是 next())返回下乙個可用的元素,如果沒有元素了,丟擲 stopiteration異常。

建立乙個返回數字的迭代器,初始值為 1,逐步遞增 1:

class

mynumbers

:def

__init__

(self)

: self.a =

1def

__iter__

(self)

:return self

def__next__

(self)

: x = self.a

self.a +=

1return x

myclass = mynumbers(

)myiter =

iter

(myclass)

#是迭代器

print

(next

(myiter)

)print

(next

(myiter)

)print

(next

(myiter)

)print

(next

(myiter)

)print

(next

(myiter)

)

突然發現不寫__iter__()也可以實現,但是其實以下物件已經不是乙個迭代器,也不是可迭代物件。只是乙個擁有next的普通物件

class

mynumbers

:def

__init__

(self)

: self.a=

2def

__next__

(self)

: x = self.a

self.a +=

1return x

myiter = mynumbers(

)print

(myiter.__next__())

print

(next

(myiter)

)print

(next

(myiter)

)print

(next

(myiter)

)print

(next

(myiter)

)

因為當使用for in 時,出錯』mynumbers』 object is not iterable

class

mynumbers

:def

__init__

(self)

: self.a=

2def

__next__

(self)

: x = self.a

self.a +=

1return x

myiter = mynumbers(

)for i in myiter:

# 'mynumbers' object is not iterable

print

(i)

在 python 中,使用了 yield 的函式被稱為生成器(generator)。

跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。

呼叫乙個生成器函式,返回的是乙個迭代器物件。

在乙個可迭代物件中,可以定義類方法__iter__(),該函式可以是乙個生成器函式,返回乙個生成器,也就是迭代器。

class

treenode

:def

__init__

(self,key,val,left=

none

,right=

none

,parent=

none):

self.key = key

self.payload = val

self.leftchild = left

self.rightchild = right

self.parent = parent

def__iter__

(self)

:if self:

if self.leftchild:

for elem in self.leftchild:

yield elem

yield self.key

if self.rightchild:

for elem in self.rightchild:

yield elem

Python3 可迭代 和 迭代器

可迭代iterable 可用for迴圈的資料型別 1.集合資料型別,如list,tuple,dict,set,str等 2.generator,包括生成器和帶yield的generator function 生成器不但可以作用於for迴圈,還可以被next 函式不斷呼叫並返回下乙個值,直到最後丟擲s...

python3 迭代器 python3 迭代器

auther aaron fan 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinsta...

PYTHON 迭代器 可迭代物件

通過重複執行的 處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。1 非迭代例子 loop 0 while loop 3 print hello world loop 1 2 迭代例子 loop...