列表的問題
列表生成器可以直接創建一個表,
但是,如果一個表中有100萬個元素,那么這個表太占空間,
而且往往我們僅僅需要訪問前面幾個元素,后面絕大多數元素占用的空間都白白浪費了。
生成器
如果列表元素可以按照某種算法推算出來,那我們可以在循環的過程中不斷的推算出后續的元素。而不用一開始就創建整個list.
這樣,節省了大量的空間。
這種一遍循環一遍計算的機制,稱為生成器:generator.
創建生成器generator.
第一種方法:只要報一個列表生成式的[]改成(),就穿件了一個generator.
創建列表
L = [x*x for x in range(10)] print L #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
創建生成器
g =(x*x for x in range(10)) for n in g: print n
第二種方法:用函數來實現。裂變生成式的for循環無法實現的時候,還可以用函數來實現。
如果一個函數定義中包含yield關鍵字,那么這個函數就不再是一個普通函數,而是一個generator
def fib(m): n, a, b = 0, 0, 1 while n < m: yield b a, b = b, a + b n = n + 1 return
在生成器中,不允許return后面帶任何參數。否則:SyntaxError: 'return' with argument inside generator
因為在生成器中,return會引起StopIterationError。 一般生成器也不通過這種return的方式返回值。
函數生成器的工作原理:
函數定義中包含yield關鍵字那么函數就變成了生成器。在生成器執行過程中,遇到yield就中斷,下次又繼續從中斷點后執行。
函數形式定義的生成器一般不會用next()來獲取下一個返回值。而是直接用for循環來迭代。