生成器 Generator

咱們有時候須要一個可迭代對象。好比列表,但遇到海量數據時每每很是耗內存,費空間,這時不妨考慮使用生成器。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 *
能夠看出返回一個對象,而且只能遍歷一次。
相關文章
相關標籤/搜索