成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

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()方法。

標(biāo)簽: