概念?
是一個特殊的迭代器忙芒,擁有迭代器的特性;主要是為了節(jié)省內(nèi)存空間讳侨,就是用到了才去生成呵萨,才去取值,而不是一下子把所有的都取出來跨跨;
創(chuàng)建方式:
1.通過推導(dǎo)式:其實(shí)就是把列表推導(dǎo)式的[]換成()
l=(x for x in range(10000000))
print(l.__next__())
2.通過生成器函數(shù)潮峦,生成器函數(shù)主要有兩個特點(diǎn),第一是函數(shù)中包含yield語句勇婴,第二是函數(shù)的執(zhí)行結(jié)果就是一個生成器:
def generator():
????print(5)
????yield 6
????print(4)
????yield 1
gen=generator()
print(next(gen))
print(next(gen))
訪問生成器數(shù)據(jù):可以通過next()函數(shù)忱嘹,或者生成器對象的方法:__next__(),以及for in;我們應(yīng)該注意到的是函數(shù)的執(zhí)行結(jié)果是一個生成器耕渴,但是其實(shí)我們在調(diào)用函數(shù)執(zhí)行的時候拘悦,函數(shù)并沒有執(zhí)行,只有當(dāng)訪問生成器數(shù)據(jù)的時候才會執(zhí)行橱脸,并且遇到y(tǒng)ield語句的時候就會被暫停础米;
next(gen)
gen.__next__()
for i in gen:
????print(i)
send()方法:其實(shí)和next()的功能差不多,只不過多了一個功能添诉,就是可以給上一次yield語句指定返回結(jié)果屁桑,這里需要注意一點(diǎn)是上一次,那么如果是第一次執(zhí)行的話栏赴,由于沒有上一次掏颊,所以指定的結(jié)果只能為none;
def generator():
????print(5)
????res= yield 6
????print(res)
????yield 1
gen=generator()
print(gen.send(None))
print(gen.send('a'))
注意事項(xiàng):首先生成器如果碰到return語句,會報StopIteration異常乌叶,因?yàn)閞eturn就是返回盆偿,后面就不會執(zhí)行了,肯定會拋出異常准浴,第二點(diǎn)是生成器和迭代器一樣事扭,只會執(zhí)行一遍,執(zhí)行完畢就會被釋放乐横;