Python語法 迭代器 生成器

2021-09-11 13:48:42 字數 2264 閱讀 2750

迭代器

迭代器物件要求支援迭代器協議的物件,在python中,支援迭代器協議就是實現物件的__iter__()和next()方法。其中__iter__()方法返回迭代器物件本身;next()方法返回容器的下乙個元素,在結尾時引發stopiteration異常。

__iter__()和next()方法

這兩個方法是迭代器最基本的方法,乙個用來獲得迭代器物件,乙個用來獲取容器中的下乙個元素。

對於可迭代物件,可以使用內建函式iter()來獲取它的迭代器物件。

通過iter()方法獲得了list的迭代器物件,然後就可以通過next()方法來訪問list中的元素了。當容器中沒有可訪問的元素後,next()方法將會丟擲乙個stopiteration異常終止迭代器。

其實,當我們使用for語句的時候,for語句就會自動的通過__iter__()方法來獲得迭代器物件,並且通過next()方法來獲取下乙個元素。

迭代器和可迭代物件

對於乙個可迭代物件,如果它本身又是乙個迭代器物件,就會有下面的 問題,就沒有辦法支援多次迭代。

為了解決上面的問題,可以分別定義可迭代型別物件和迭代器型別物件;然後可迭代型別物件的__iter__()方法可以獲得乙個迭代器型別的物件。

class

zrange

:def

__init__

(self, n)

: self.n = n

def__iter__

(self)

:return zrangeiterator(self.n)

class

zrangeiterator

:def

__init__

(self, n)

: self.i =

0 self.n = n

def__iter__

(self)

:return self

defnext

(self)

:if self.i < self.n:

i = self.i

self.i +=

1return i

else

:raise stopiteration(

)

zrange = zrange(3)

print zrange is

iter

(zrange)

print

[i for i in zrange]

print

[i for i in zrange]

生成器

在python中,使用生成器可以很方便的支援迭代器協議。生成器通過生成器函式產生,生成器函式可以通過常規的def語句來定義,但是不用return返回,而是用yield一次返回乙個結果,在每個結果之間掛起和繼續它們的狀態,來自動實現迭代協議。

也就是說,yield是乙個語法糖,內部實現支援了迭代器協議,同時yield內部是乙個狀態機,維護著掛起和繼續的狀態。

生成器表示式

在開始介紹生成器表示式之前,先看看我們比較熟悉的列表解析( list comprehensions),列表解析一般都是下面的形式。

[expr for iter_var in iterable if cond_expr]

生成器表示式的語法和列表解析一樣,只不過生成器表示式是被()括起來的,而不是

(expr for iter_var in iterable if cond_expr)

遞迴生成器

生成器可以像函式一樣進行遞迴使用的,下面看乙個簡單的例子,對乙個序列進行全排列:

def

permutations

(li):if

len(li)==0

:yield li

else

:for i in

range

(len

(li)):

li[0]

, li[i]

= li[i]

, li[0]

for item in permutations(li[1:

]):yield

[li[0]

]+ item

for item in permutations(

range(3

)):print item

```#以上內容整理自summercamp中的學習資料。

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...