Python語法—迭代器、生成器
Python語法—迭代器、生成器
迭代器
迭代器物件要求支援迭代器協議的物件,在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
def next(self):
if self.i < self.n:
i = self.i
self.i += 1
return 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 生成器&迭代器Python
- Python生成器、迭代器、可迭代物件Python物件
- Python之可迭代物件、迭代器、生成器Python物件
- Python迭代器與生成器Python
- Python迭代器&生成器&裝飾器Python
- Python3-流程控制語句、迭代器、生成器Python
- 1.5.4 Python迭代器和生成器Python
- Python的迭代器和生成器Python
- python_裝飾器——迭代器——生成器Python
- 迭代器,生成器
- 迭代器、生成器
- 史上最全 Python 迭代器與生成器Python
- python3.7 迭代器和生成器Python
- 可迭代物件、迭代器、生成器物件
- 搞清楚 Python 的迭代器、可迭代物件、生成器Python物件
- Python之裝飾器、迭代器和生成器Python
- Python基礎(四)——迭代器/物件,生成器Python物件
- 草根學Python(七) 迭代器和生成器Python
- python迭代器和生成器的總結Python
- 《python-美藏篇》1.可迭代、迭代器與生成器Python
- 可迭代物件 vs 迭代器 vs 生成器物件
- 簡單介紹python迭代器和生成器Python
- Python學習筆記 - 迭代器和生成器Python筆記
- 生成器函式,迭代器函式
- 詳解python三大器——迭代器、生成器、裝飾器Python
- Python學習之路34-迭代器和生成器Python
- PHP的迭代器和生成器PHP
- Python入門之迭代器與生成器的區別Python
- Python的生成器和迭代器有什麼區別?Python
- python 中的迭代器和生成器簡單介紹Python
- Python函數語言程式設計系列012:惰性列表之生成器與迭代器Python函數程式設計
- 生成器與迭代器的區別
- Python學習之三大名器-裝飾器、迭代器、生成器Python
- 前端面試複習2:迭代器,生成器與非同步迭代器前端面試非同步
- 什麼是Python的迭代器和生成器?(附程式碼)Python
- python3基礎 之 迭代器與生成器,生成式Python
- 迭代器和生成器區別是什麼?Python學習!Python
- 好程式設計師Python培訓分享Python生成器與迭代器程式設計師Python