什麼是生成器?

迭代器

什麼是生成器了?生成器就是懶人版迭代器。那迭代器又是什麼了?我們會經常寫for循環,類似這樣的。

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

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

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

生成器

看了上面的迭代器,我們發現,需要迭代數據,這些數據都要事先生成,如果數據量很大,就需要佔用大量內存。

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

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很類似,但執行到yield時候,立即返回。但是,在下一次進入函數時候,要從yield後面一行代碼開始執行。

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

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

4
test
StopIteration

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章