迭代器
什么是生成器了蝗锥?生成器就是懶人版迭代器跃洛。那迭代器又是什么了?我們會(huì)經(jīng)常寫for循環(huán)终议,類似這樣的汇竭。
for i in [1, 32, 56]:
print(i)
這個(gè)列表就是一個(gè)可以迭代的對象,for語句其實(shí)就是把迭代器的過程給隱式化了穴张。其實(shí)细燎,可迭代對象使用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í)候,才會(huì)生成下一個(gè)變量墓塌,生成器可以通過()生成档冬,也可以在函數(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í)候披坏,立即返回态坦。但是,在下一次進(jìn)入函數(shù)時(shí)候棒拂,要從yield后面一行代碼開始執(zhí)行伞梯。
def test():
yield 4
print('test')
a = test()
print(next(a))
print(next(a))
4
test
StopIteration
第一次執(zhí)行next時(shí),在yield返回為4帚屉,在執(zhí)行第二次next時(shí)谜诫,執(zhí)行print('test')語句,由于生成器沒有元素了攻旦,所以報(bào)錯(cuò)StopIteration喻旷。
今天的分享就到這了,我們下期再見~