迭代器
迭代器物件要求支援迭代器協議的物件,在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 再次呼叫這個函式時,一切都將從頭建立。...