迭代器
什麼是生成器了?生成器就是懶人版迭代器。那迭代器又是什麼了?我們會經常寫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。
今天的分享就到這了,我們下期再見~