1.什么是生成器
生成器就是迭代器掉冶, 但是迭代器不一定是生成器
1)怎么創(chuàng)建生成器
如果函數(shù)中有yield關(guān)鍵字往湿,那么這個(gè)函數(shù)就不再是一個(gè)普通的函數(shù)柑爸。
調(diào)用函數(shù)不再是執(zhí)行函數(shù)體,獲取返回值盲镶。而是創(chuàng)建這個(gè)函數(shù)對應(yīng)的生成器對象
def nums():
print('============')
print(100)
if False:
yield
return 100
gen1 = nums() # 函數(shù)調(diào)用表達(dá)式nums()才是生成器
2)生成器怎么產(chǎn)生數(shù)據(jù)
一個(gè)生成器能夠產(chǎn)生多少個(gè)數(shù)據(jù)仓蛆,就看執(zhí)行完生成器對應(yīng)的函數(shù)體會遇到幾次yield關(guān)鍵字
生成器是在獲取數(shù)據(jù)的時(shí)候才會產(chǎn)生數(shù)據(jù)睁冬,執(zhí)行生成器對應(yīng)的函數(shù)的函數(shù)體,直到遇到y(tǒng)ield為止看疙,
將yield后面的數(shù)據(jù)作為生成器的元素返回豆拨,并且會記錄這次產(chǎn)生數(shù)據(jù)函數(shù)體結(jié)束的位置,下次再產(chǎn)生
數(shù)據(jù)的時(shí)候能庆,會接著上次結(jié)束的位置接著往后執(zhí)行...如果從執(zhí)行開始到函數(shù)結(jié)束施禾,沒有遇到y(tǒng)ield,那么就不會產(chǎn)生數(shù)據(jù)搁胆。
def nums():
print('++++++')
yield 'abc'
print('-------')
yield 100
print('********')
for x in range(5):
yield x
# 創(chuàng)建一個(gè)生成器gen2
gen2 = nums()
print('取第一個(gè)值')
print(next(gen2))
print('取第二個(gè)值')
print(next(gen2))
print('取第三個(gè)值')
print(next(gen2))
# 練習(xí): 寫一個(gè)生產(chǎn)器弥搞,能夠產(chǎn)生'stuXXXX'的學(xué)號邮绿, stu0000 ~ stu9999
def stu_num_creater(count, width=0):
for num in range(count):
if width == 0:
width = len(str(count))
num_str = 'stu' + str(num).zfill(width)
yield num_str
creater = stu_num_creater(100, 4)
print(next(creater))
for num in creater:
print(num)
生成式
生產(chǎn)式是生成器的另外一種寫法(簡寫)
a.語法1:
生成器變量 = (表達(dá)式 for 變量 in 序列) -- 結(jié)果是生成器
列表變量 = [表達(dá)式 for 變量 in 序列] -- 結(jié)果是列表
b.說明: 表達(dá)式 - 可以是值、變量攀例、運(yùn)算表達(dá)式船逮、函數(shù)調(diào)用表達(dá)式等,只要不是賦值語句都可以
c.展開
def 函數(shù)名():
for 變量 in 序列:
yield 表達(dá)式
gen1 = (x*2 for x in range(5))
print(gen1)
for num in gen1:
print(num)
"""
a.語法2:
生成器變量 = (表達(dá)式 for 變量 in 序列 if 條件語句)
b.展開
def 函數(shù)名():
for 變量 in 序列:
if 條件語句:
yield 表達(dá)式
"""
gen2 = (x for x in range(10) if x % 2)
# 5個(gè) 1粤铭,3傻唾,5,7承耿,9
for num in gen2:
print(num)
gen2 = ((x, x*2) for x in range(10) if x % 2)
for num in gen2:
print(num)
gen2 = ((x, x*2) for x in range(10) if x % 2)
list2 = list(gen2)
print(list2)