生成器是一次生成一個值的特殊類型函數。可以將其視為可恢復函數。調用該函數將返回一個可用於生成連續 x 值的生成器【Generator】
簡單的說就是在函數的執行過程中,yield語句會把你需要的值返回給調用生成器的地方,然后退出函數,下一次調用生成器函數的時候又從上次中斷的地方開始執行,而生成器內的所有變量參數都會被保存下來供下一次使用。
示例代碼
>>> def fib(max): a, b = 0, 1 while a < max: yield a a, b = b, a + b >>> for i in fib(1000): print(i) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>>f = fib(1000) >>>f.next() #python 3.0 要寫成f.__next__() 否則出錯 0 >>>f.next() 1 >>>f.next() 1 >>>f.next() 2
#python 3.0 要寫成f.__next__() 否則出錯 AttributeError: 'generator' object has no attribute 'next'
在函數fib(max)內定義了一個生成器,但是對fib(max)的調用永遠只能獲得一個單獨的生成器對象,而不是執行函數里面的語句,這個對象(generator object)包含了函數的原始代碼和函數調用的狀態,這狀態包括函數中變量值以及當前的執行點——函數在yield語句處暫停(suspended),返回當前的值並儲存函數的調用狀態,當需要下一個條目(item)時,可以再次調用next,從函數上次停止的狀態繼續執行,知道下一個yield語句。
生成器和函數的主要區別在於函數 return a value,生成器 yield a value同時標記或記憶 point of the yield 以便於在下次調用時從標記點恢復執行。 yield
使函數轉換成生成器,而生成器反過來又返回迭代器。
有三種方式告訴循環生成器中沒有更多的內容:
- 執行到函數的末尾("fall off the end")
- 用一個return語句(它可能不會返回任何值)
- 拋出StopIteration異常
總的來說生成器是一類特殊 迭代器。 一個產生值的函數 yield
是一種產生一個迭代器卻不需要構建迭代器的精密小巧的方法
內容參考 http://www.cnblogs.com/moinmoin/archive/2011/11/15/1990840.html