1.yeild版本的斐波那契數列
def fab(max):n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1
'''
第四個版本的 fab 和第一版相比,僅僅把 print b 改為了 yield b,就在保持簡潔性的同時獲得了 iterable 的效果。
呼叫第四版的 fab 和第二版的 fab 完全一致:
>>> for n in fab(5):... print n
...
1 1
2 3
5
簡單地講,yield 的作用就是把乙個函式變成乙個 generator,帶有 yield 的函式不再是乙個普通函式,python 直譯器會將其視為乙個 generator,呼叫 fab(5) 不會執行 fab 函式,而是返回乙個 iterable 物件!在 for 迴圈執行時,每次迴圈都會執行 fab 函式內部的**,執行到 yield b 時,fab 函式就返回乙個迭代值,下次迭代時,**從 yield b 的下一條語句繼續執行,而函式的本地變數看起來和上次中斷執行前是完全一樣的,於是函式繼續執行,直到再次遇到 yield。
也可以手動呼叫 fab(5) 的 next() 方法(因為 fab(5) 是乙個 generator 物件,該物件具有 next() 方法),這樣我們就可以更清楚地看到 fab 的執行
2迭代器版本的
class fab(object):def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def next(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise stopiteration()
fab 類通過 next() 不斷返回數列的下乙個數,記憶體占用始終為常數:
>>> for n in fab(5):... print n
...
1 1
2 3
5
python之生成器yeild
思考 首先思考這樣乙個問題 建立乙個列表,但是記憶體受限,容量一定是有限的。那麼如果建立了乙個包含100萬個元素的列表,不僅占用很大的儲存空間,而我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了?這個時候就需要乙個容器,在我們需要資料的時候拿出來,不取資料的時候就釋放掉。這樣就...
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...