生成器函數(shù)
'''
yield類似于return
相同:
都返回出去一個值
不同:
yield每次返回時, 會記錄當(dāng)前執(zhí)行的位置
等下次調(diào)用生成器, 會從該位置向下走
return 直接終止函數(shù)
'''
# 2. 生成器函數(shù)
def mygen():
print('one')
yield 1
print('two')
yield 2
print('three')
yield 3
# 創(chuàng)建生成器對象
gen = mygen()
# 使用next
res = next(gen)
'''
首先初始化生成器, 返回一個生成器對象
第一次調(diào)用: 執(zhí)行print('one'), yield返回1,
暫停記錄當(dāng)前位置
第二次調(diào)用: 執(zhí)行print('two'), yield返回2,
暫停記錄當(dāng)前位置
第三次調(diào)用: 執(zhí)行print('three'), yield返回3,
暫停記錄當(dāng)前位置,
此時生成器已經(jīng)不能在返回數(shù)據(jù), 再次調(diào)用就會報錯
'''
生成器寫斐波那契數(shù)列?
def fbnq(max_len):
a = 0
b = 1
i = 0
while i < max_len:
yield b
a, b = b, a + b
# yield a
i += 1
gen = fbnq(10)
for i in gen:
print(i)
send
'''
next和send的區(qū)別:
next: 只能取值
send: 能取本次yield的返回值,
也能給上次yield傳入值.
send注意點:
第一個send不能給yield傳值, 默認(rèn)寫None
最后一個yield接收不到send的發(fā)送值
'''
def mygen():
print('start')
res = yield 1
print(res)
# res是send第二次的傳入值, yield把2返回給send
res = yield 2
print(res)
res = yield 3
print(res)
# 初始化生成器, 獲得生成器對象
gen = mygen()
# 第一次調(diào)用, send傳入None
yield_res = gen.send(None)
yield_res = gen.send('send1')
yield_res = gen.send('send2')
# 此時生成器已經(jīng)沒有數(shù)據(jù), 再次調(diào)用就會報錯
# yield_res = gen.send('send3')
# send和next可以混合使用
gen = mygen()
yield_res = gen.send(None)
yield_res = next(gen)
yield_res = next(gen)
yield from
把可迭代對象變成一個迭代器返回
def mygen():
listvar = ["鼎泰亞", "李楠", "陳根基", "陳元勇"]
yield from listvar
gen = mygen()
for i in gen:
print(i)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。