轉載http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/python
如下是理解概括app
###如何生成斐波那契數列ide
def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1
執行函數
fab(5)
問題是print太多了code
def fab(max): n, a, b = 0, 0, 1 L = [] while n < max: L.append(b) a, b = b, a + b n = n + 1 return L
問題是若是max很大,那麼L就很大,佔內存對象
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()
執行內存
for n in Fab(5): print n
iterable每次只佔next的時候的內存get
問題:感受代碼太多,沒有初版的 fab 函數來得簡潔generator
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1
執行博客
for n in fab(5): print n
###參考博客文字
簡單地講,yield 的做用就是把一個函數變成一個 generator,帶有 yield 的函數再也不是一個普通函數,Python 解釋器會將其視爲一個 generator,調用 fab(5) 不會執行 fab 函數,而是返回一個 iterable 對象!在 for 循環執行時,每次循環都會執行 fab 函數內部的代碼,執行到 yield b 時,fab 函數就返回一個迭代值,下次迭代時,代碼從 yield b 的下一條語句繼續執行,而函數的本地變量看起來和上次中斷執行前是徹底同樣的,因而函數繼續執行,直到再次遇到 yield。
(iterable和generator)通常不會手動的調用next方法,而使用for循環,若是一直使用next,當到最後一個沒有的時候,就會拋異常;
有yield的時候,由於yield至關於另外的返回值,不能直接return具體值(不過在3.0以後的python就能夠在yield以前return一個值),會拋SyntaxError: 'return' with argument inside generator
異常