咱們有時候須要一個可迭代對象。好比列表,但遇到海量數據時每每很是耗內存,費空間,這時不妨考慮使用生成器。python
生成器是迭代器,只能遍歷一次,返回一個生成器對象。特色:按需計算,惰性求值。算法
g = (i for i in range(10)) >>> g <generator object <genexpr> at 0x00000200BFA71570>
用next()
函數能夠不斷得到下一個返回值,generator保存的是算法,每次調用next(g)
,就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration
的錯誤。函數
一般咱們建立了一個generator後,基本上永遠不會調用next()
,而是經過for
循環來迭代它,而且不須要關心StopIteration
的錯誤。code
def inc(): for i in range(5): yield i 等價於 def inc(): yield from range(1000) # yield from iterable 是 for item in iterable: yield item 的語法糖
若是一個函數定義中包含yield
關鍵字,那麼這個函數就再也不是一個普通函數,而是一個generator,可用於迭代。對象
yield
是一個相似return
的關鍵字,迭代一次遇到yield
時就返回yield
右邊的值,而且記住這個返回的位置,下次迭代就從這個位置後(下一行)開始。內存
def inc(): for i in range(5): yield i print(type(inc) x = inc() print(x) print(type(x)) print(next(x)) for m in x: print(m, '*') for m in x: print(m, '**') 運行結果: <class 'function'> <generator object inc at 0x0000024F97ED15C8> <class 'generator'> 0 1 * 2 * 3 * 4 * 能夠看出返回一個對象,而且只能遍歷一次。