什么是生成器?

迭代器

什么是生成器了?生成器就是懶人版迭代器。那迭代器又是什么了?我們會經(jīng)常寫for循環(huán),類似這樣的。

for i in [1, 32, 56]:
    print(i)

這個列表就是一個可以迭代的對象,for語句其實就是把迭代器的過程給隱式化了。其實,可迭代對象使用iter函數(shù)就能編程迭代器,通過next函數(shù)就可以完成遍歷。

l1 = [1, 2, 3]
i = iter(l1)
print(i)

print(next(i))
print(next(i))
print(next(i))
print(next(i))

<list_iterator object at 0x0000020595F65760>
1
2
3
StopIteration

生成器

看了上面的迭代器,我們發(fā)現(xiàn),需要迭代數(shù)據(jù),這些數(shù)據(jù)都要事先生成,如果數(shù)據(jù)量很大,就需要占用大量內(nèi)存。

生成器則不同,生成器只有再調(diào)用next函數(shù)時候,才會生成下一個變量,生成器可以通過()生成,也可以在函數(shù)中使用yield關(guān)鍵詞,這樣函數(shù)就是生成器了。

g = (i for i in range(10000))
print(g)

<generator object <genexpr> at 0x000001DBD3FEBBA0>

或者是

def g():
    for i in range(10000):
        yield i

print(g())

yield的理解

yield和return很類似,但執(zhí)行到y(tǒng)ield時候,立即返回。但是,在下一次進入函數(shù)時候,要從yield后面一行代碼開始執(zhí)行。

def test():
    yield 4
    print('test')

a = test()
print(next(a))
print(next(a))

4
test
StopIteration

第一次執(zhí)行next時,在yield返回為4,在執(zhí)行第二次next時,執(zhí)行print('test')語句,由于生成器沒有元素了,所以報錯StopIteration。

今天的分享就到這了,我們下期再見~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容