Python——通过斐波那契数列来理解生成器
一、生成器(generator)
先來看看一個簡單的菲波那切數列,出第一個和第二個外,任意一個數都是由前兩個數相加得到的。如:0,1,1,2,3,5,8,13......
輸入斐波那契數列前N個數:
def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1?結果:
>>> fib(100) 1 1 2 3 5 8 13但是,要提高 fib 函數的可復用性,最好不要直接打印出數列,而是返回一個 List。每次循環將b的值append到一個list中。
然而,問題又來了。。。
該函數在運行中占用的內存會隨著參數 max 的增大而增大,如果要控制內存占用,最好不要用 List來保存中間結果,而是通過 iterable 對象來迭代。
在python2 中:
for i in range(1000): passrange會生成一個含有1000個元素的list,極大地浪費了內存空間。
for i in xrange(1000): pass而改進后的xrange則生成一個可迭代(iterable)對象,每次迭代時返回下一個數值,占用空間極少。
如此,我們可以利用iterable來寫一個fib類:
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循環會在每次循環中自動調用next()方法,不斷返回數列的下一個數。占用內存始終為常數。
>>> for n in Fab(5): ... print(n)雖然實現了需求,但用class實現的fib并不簡潔,由此我們可以引入yield。
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,調用 fib(5) 不會執行 fab 函數,而是返回一個 iterable 對象在 for 循環執行時,每次循環都會執行 fib 函數內部的代碼,執行到 yield b 時,fib 函數就返回一個迭代值,下次迭代時,代碼從 yield b 的下一條語句繼續執行,而函數的本地變量看起來和上次中斷執行前是完全一樣的,于是函數繼續執行,直到再次遇到 yield。
手動執行過程:
>>> f = fab(5) >>> f.next() 1 >>> f.next() 1 >>> f.next() 2 >>> f.next() 3 >>> f.next() 5 >>> f.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration當函數執行結束時,generator 自動拋出 StopIteration 異常,表示迭代完成。在 for 循環里,無需處理 StopIteration 異常,循環會正常結束。
一個帶有 yield 的函數就是一個 generator,它和普通函數不同,生成一個 generator 看起來像函數調用,但不會執行任何函數代碼,直到對其調用 next()(在 for 循環中會自動調用 next())才開始執行。雖然執行流程仍按函數的流程執行,但每執行到一個 yield 語句就會中斷,并返回一個迭代值,下次執行時從 yield 的下一個語句繼續執行。看起來就好像一個函數在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。
?
轉載于:https://www.cnblogs.com/pyramid1001/p/5854712.html
總結
以上是生活随笔為你收集整理的Python——通过斐波那契数列来理解生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5增加的几个新的标签
- 下一篇: python 前端开发_python和前