day12 生成器 yield

1.什么是生成器

生成器就是迭代器, 但是迭代器不一定是生成器

1)怎么創(chuàng)建生成器

如果函數(shù)中有yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通的函數(shù)。
調(diào)用函數(shù)不再是執(zhí)行函數(shù)體,獲取返回值。而是創(chuàng)建這個函數(shù)對應的生成器對象

def nums():
    print('============')
    print(100)
    if False:
        yield
    return 100


gen1 = nums()      # 函數(shù)調(diào)用表達式nums()才是生成器

2)生成器怎么產(chǎn)生數(shù)據(jù)

一個生成器能夠產(chǎn)生多少個數(shù)據(jù),就看執(zhí)行完生成器對應的函數(shù)體會遇到幾次yield關(guān)鍵字

生成器是在獲取數(shù)據(jù)的時候才會產(chǎn)生數(shù)據(jù),執(zhí)行生成器對應的函數(shù)的函數(shù)體,直到遇到y(tǒng)ield為止,
將yield后面的數(shù)據(jù)作為生成器的元素返回,并且會記錄這次產(chǎn)生數(shù)據(jù)函數(shù)體結(jié)束的位置,下次再產(chǎn)生
數(shù)據(jù)的時候,會接著上次結(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)建一個生成器gen2
gen2 = nums()
print('取第一個值')
print(next(gen2))
print('取第二個值')
print(next(gen2))
print('取第三個值')
print(next(gen2))
# 練習:  寫一個生產(chǎn)器,能夠產(chǎn)生'stuXXXX'的學號, 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:
生成器變量 = (表達式 for 變量 in 序列) -- 結(jié)果是生成器
列表變量 = [表達式 for 變量 in 序列] -- 結(jié)果是列表

b.說明: 表達式 - 可以是值、變量、運算表達式、函數(shù)調(diào)用表達式等,只要不是賦值語句都可以

c.展開
def 函數(shù)名():
for 變量 in 序列:
yield 表達式

gen1 = (x*2 for x in range(5))
print(gen1)
for num in gen1:
    print(num)

"""
a.語法2:
生成器變量 = (表達式 for 變量 in 序列 if 條件語句)

b.展開
def 函數(shù)名():
for 變量 in 序列:
if 條件語句:
yield 表達式
"""

gen2 = (x for x in range(10) if x % 2)
# 5個  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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

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