Python生成器函數(shù)和生成器表達(dá)式
生成器是一個可以產(chǎn)生一系列值的機(jī)器。與將對象的所有元素都存入內(nèi)存之后再進(jìn)行操作的方式不同,生成器在迭代至某個元素時才計算并生成該元素放入內(nèi)存。生成器是創(chuàng)建迭代器的工具,但它的對象僅產(chǎn)生值。有兩種寫法的
生成器是一個可以產(chǎn)生一系列值的機(jī)器。與將對象的所有元素都存入內(nèi)存之后再進(jìn)行操作的方式不同,生成器在迭代至某個元素時才計算并生成該元素放入內(nèi)存。生成器是創(chuàng)建迭代器的工具,但它的對象僅產(chǎn)生值。有兩種寫法的生成器:生成器函數(shù)和生成器表達(dá)式。
生成器函數(shù)的寫法
生成器函數(shù)是指帶有一個或多個yield語句的函數(shù),通過使用yield語句來生成值。
def generator():
yield value
例如,定義一個生成器函數(shù)如下:
def gen():
yield 3
g gen()
print(g)
# lt;generator object gen at 0x000001C62689C2A0gt;
生成器對象并沒有返回yield語句中的值,而是返回一個內(nèi)存地址。雖然生成器是創(chuàng)建迭代器的工具,但返回的值并不是迭代器。我們可以通過以下示例驗證這一點(diǎn):
def gen():
yield 3
g gen()
for x in g:
print(x)
# 3
def gen():
yield 3
g gen()
print(next(g))
# 3
上述示例表明生成器函數(shù)對象就是一個迭代器,但迭代器內(nèi)的值并沒有預(yù)先放在內(nèi)存中,而是需要的時候通過yield語句生成值。這是生成器函數(shù)的最大優(yōu)點(diǎn)。完全可以將生成器函數(shù)稱為生成器式的迭代器。
生成器函數(shù)的多個yield語句
生成器函數(shù)可以使用多個yield語句,或者在迭代yield語句產(chǎn)生值時使用next()方法或for循環(huán)來取值。每次取值都是從上次停止取值的位置的yield語句開始,直到所有的yield語句被使用完。如果再次使用next()函數(shù),將會報錯。
永遠(yuǎn)執(zhí)行的生成器函數(shù)的轉(zhuǎn)發(fā)方法
生成器函數(shù)可以通過(value)方法和()方法進(jìn)行轉(zhuǎn)發(fā)。send方法執(zhí)行生成器函數(shù)并發(fā)送值(參數(shù)value),該值將成為當(dāng)前yield表達(dá)式的結(jié)果。使用變量來接收yield生成的值。
def gen(element):
while True:
newE yield element
if element is not None:
element newE
g gen('rose')
print(next(g))
# rose
print(('tom'))
# tom
()
再次調(diào)用send()方法時將會報錯。對于永遠(yuǎn)執(zhí)行的生成器函數(shù)(while True),不要忘記使用最后的close()方法。