python 3.x 學習筆記5 ( 迭代器 and 產生器 ),python3.x
1.迭代器(Iterator):
可以被next()函數調用並不斷返回下一個值的對象,成為迭代器:Iterator
可以直接用於for 迴圈的對象統稱為可迭代對象:Iterable
迭代,顧名思義就是重複做一些事很多次(就現在迴圈中做的那樣)。迭代器是實現了__next__()方法的對象(這個方法在調用時不需要任何參數),它是訪問可迭代序列的一種方式,通常其從序列的第一個元素開始訪問,直到所有的元素都被訪問才結束。但是迭代器只能前進不能後退
優點:
使用迭代器不要求事先準備好整個迭代過程中的所有元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後元素可以不存在或者被銷毀。因此迭代器適合遍曆一些數量巨大甚至無限的序列。
2.產生器:
只有調用時才會產生相應的資料,且只有一個__next__()方法
如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為產生器(Generator)。
建立方法:
1)最簡單的是把一個列表產生式的[]改成(),就建立了一個generator
2)可以把函數變成generator object,只需要把print()改為yield 即可。
3.
yeild 作用:儲存目前狀態並返回
send()作用:喚醒並傳遞一個值
__next__()作用:只是喚醒
4.
產生器都是Iterator對象,但是list、低產田、str雖然是Iterable,卻不是Iterator,把list、dict、str等Iterable變成Iterator可以使用iter()函數。
5.通過yield將斐波那契函數變成產生器
1 def fib(max): 2 n,a,b = 0,0,1 3 while n < max: 4 yield b #將函數變成產生器 5 a,b = b,a+b 6 n += 1 7 return 'lalalalal' 8 9 f = fib(10)10 11 while True:12 try13 x = next(f) #相當於執行一次函數fib()14 print(x)15 except StopIteration as e:16 print('Generator return value is %s '%e.value) #e的value是函數傳回值如fib函數的傳回值'lalalalal'17 break