三大神器其三 生成器

一、何為生成器

  • 生成器就是迭代器
  • 調(diào)用一個(gè)帶有yield關(guān)鍵字的函數(shù)就可以得到一個(gè)生成器
def func1():
    print('++++')
    print('----')
    yield

result = func1()
print('result:', result)

二、生成器如何產(chǎn)生數(shù)據(jù)

  • 生成器能生產(chǎn)多少數(shù)據(jù)就看執(zhí)行生成器對(duì)應(yīng)的函數(shù)的函數(shù)體會(huì)遇到幾次 yield ;
  • yield 后面表達(dá)式的值就是生成器能夠產(chǎn)生的數(shù)據(jù)。
#示例一:創(chuàng)建一個(gè)生成器可以產(chǎn)生3個(gè)數(shù)據(jù)分別是:10, 100, 78
def create_gender1():
    yield 10
    yield 100
    yield 78

gen1 = create_gender1()
print(list(gen1))      #[10, 100, 78]

三、生成器產(chǎn)生數(shù)據(jù)的原理

  • 當(dāng)獲取生成器元素的時(shí)候,會(huì)自動(dòng)調(diào)用生成器關(guān)聯(lián)的函數(shù)。第一次從函數(shù)開始的地方開始執(zhí)行,直到遇到 yield 為止,并且將 yield 后面的值作為獲取到的數(shù)據(jù);
  • 后面每次都是從上一次結(jié)束的位置開始執(zhí)行,直到遇到 yield。如果從開始執(zhí)行到函數(shù)結(jié)束都沒有遇到 yield 就不會(huì)產(chǎn)生數(shù)據(jù)(如果是用 next 去取的數(shù)據(jù)這個(gè)時(shí)候會(huì)報(bào)錯(cuò))
def create_gender2():
    print('函數(shù)開始')
    yield 10
    print('++++++')
    yield 98
    print('========')
    yield 100
    print('函數(shù)結(jié)束')


gen2 = create_gender2()
print('========第1次========')
print(f'元素: {next(gen2)}')
print('========第2次========')
print(f'元素: {next(gen2)}')
print('========第3次========')
print(f'元素: {next(gen2)}')
print('========第4次========')
# print(f'元素: {next(gen2)}')    # 報(bào)錯(cuò):StopIteration


# 可以不斷產(chǎn)生數(shù)據(jù)
def create_gender3():
    num = 0
    while True:
        num += 1
        yield num


gen3 = create_gender3()
print(next(gen3))


# 練習(xí):寫一個(gè)產(chǎn)生4位驗(yàn)證碼的生成器(驗(yàn)證碼有隨機(jī)的4位數(shù)字和字母組成)
from random import choices


def code_gender4():
    alp = 'abcdefghijklmnopqrstuvwxyz'
    str1 = alp + alp.upper() + '0123456789'
    while True:
        yield ''.join(choices(str1, k=4))


gen4 = code_gender4()
print(next(gen4))
print(next(gen4))


# 注意:每次調(diào)用函數(shù)都是在創(chuàng)建一個(gè)新的生成器對(duì)象
def create_gender5():
    for x in range(5):
        yield x


print(next(create_gender5()))    # 0
print(next(create_gender5()))    # 0

gen5 = create_gender5()
print(next(gen5))       # 0
print(next(gen5))       # 1

四、 生成式

  • 生成式就是生成器的簡寫
  • 列表推導(dǎo)式的[]變成()就變成了生成式
list1 = [x*2 for x in range(5)]
print(list1)    # [0, 2, 4, 6, 8]

gen1 = (x*2 for x in range(5))
print(gen1)     # <generator object <genexpr> at 0x103dba050>
print(next(gen1))    # 0
print(next(gen1))    # 2


# gen1 = (x*2 for x in range(5)) 相當(dāng)于:
def func():
    for x in range(5):
        yield x*2


gen1 = func()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容