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