一、何為生成器
- 生成器就是迭代器
- 調(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ù)。