1. 迭代器協議
1)迭代器協議是指:物件需要提供next方法,它要麼返回迭代中的下一項,要麼就引起乙個stopiteration異常,以終止迭代;
2)可迭代物件就是:實現了迭代器協議的物件;
3)協議是一種約定,可迭代物件實現迭代器協議,python的內建工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件。
舉個例子:在所有語言中,我們都可以使用for迴圈來遍歷陣列,python的list底層實現是乙個陣列,所以我們可以使用for迴圈來遍歷list。此外python的for迴圈不但可以用來遍歷list,還可以用來遍歷檔案物件。
為什麼在python中,檔案還可以使用for迴圈進行遍歷呢?這是因為,在python中,檔案物件實現了迭代器協議,for迴圈並不知道它遍歷的是乙個檔案物件,它只管使用迭代器協議訪問物件即可。
2. 生成器
python使用生成器對延遲操作提供了支援。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。這也是生成器的主要好處。
python有兩種不同的方式提供生成器:
1)生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行
2)生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表。
2.1 生成器函式
舉例:1)使用生成器返回自然數的平方
def gensquares(n):
for i in range(n):
yield i ** 2
for item in gensquares(5):
print(item)
for item in gensquares(5):
print(item)
2.2 生成器表示式
使用列表推導,將會一次產生所有結果:
>>>squares = [x**2 for x in range(5)]
>>>squares
[0, 1, 4, 9, 16]
將列表推導的中括號,替換成圓括號,就是乙個生成器表示式:
>>> squares = (x**2 for x in range(5))
>>> squares
at 0x0000019f5114b1a8>
>>> next(squares)
0>>> next(squares)
1>>> next(squares)
4>>> list(squares)
[9, 16]
2.3 再看生成器
1)語法上和函式類似:生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值;
2)自動實現迭代器協議:對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中(如for迴圈,sum函式)。由於生成器自動實現了迭代器協議,所以,我們可以呼叫它的next方法,並且,在沒有值可以返回的時候,生成器自動產生stopiteration異常
3)狀態掛起:生成器使用yield語句返回乙個值。yield語句掛起該生成器函式的狀態,保留足夠的資訊,以便之後從它離開的地方繼續執行
3. 示例
首先,生成器的好處是延遲計算,一次返回乙個結果。也就是說,它不會一次生成所有的結果,這對於大資料量處理,將會非常有用。
除了延遲計算,生成器還能有效提高**可讀性。例如,現在有乙個需求,求一段文字中,每個單詞出現的位置。
使用生成器的情況:
def index_words(text):
if text:
yield 0
for index, letter in enumerate(text, 1):
if letter == ' ':
yield index
4. 使用生成器的注意事項
生成器的唯一注意事項就是:生成器只能遍歷一次。
迭代器和生成器簡介
i i for i in range 8 生成器表示式 def fib n i 0a,b 1,1 while i n yield a a,b b,a b i 1 f fib 6 for item in f print item list fib 6 在生成器中,如果沒有return,則預設執行到函式...
Python迭代器和生成器
先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...
Python迭代器和生成器
迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...