需求:有的時(shí)候邏輯比較復(fù)雜筐摘,生成器推導(dǎo)式for循環(huán)
無(wú)法實(shí)現(xiàn)的時(shí)候可以選擇函數(shù)生成器
# 正常的函數(shù),遇到return語(yǔ)句就返回
def func():
print('輸出1')
print('輸出2')
print('輸出3')
return 10
f = func()
print(f) #輸出10
改為生成器:把return 改為yield
def func():
print('輸出1')
print('輸出2')
print('輸出3')
yield 10
g = func()
print(g) # 輸出generator對(duì)象
print(next(g)) # 10
多個(gè)yield:編程generator函數(shù)掂碱,在每次調(diào)用next()的時(shí)候敲街,遇到y(tǒng)ield語(yǔ)句返回值扫腺,并且暫停;如果再次執(zhí)行next從上次返回的yield語(yǔ)句執(zhí)行到下一次的yield
def func():
yield 0
print('輸出1')
yield 1
print('輸出2')
yield 2
print('輸出3')
yield 3
g = func()
print(g) # 輸出generator對(duì)象
print(next(g)) # 0
print(next(g)) # 1
遇到y(tǒng)ield中斷蚕钦,如果沒(méi)有yield再繼續(xù)執(zhí)行亭病,報(bào)錯(cuò)
練習(xí)應(yīng)用:斐波那契數(shù)列 : 1, 1, 2, 3, 5, 8, 13
def fib(count):
index = 0
x, y = 0, 1
while index < count:
print(y)
x, y = y, x+y
index += 1
fib(5)
# 修改為生成器:
def fib(count):
index = 0
x, y = 0, 1
while index < count:
yield y
x, y = y, x+y
index += 1
g = fib(5)
for i in g:
print(i) # 1, 1, 2, 3, 5,
疑問(wèn): 如果有return 和yield,怎么獲取return
def fib(count):
index = 0
x, y = 0, 1
while index < count:
yield y
x, y = y, x+y
index += 1
return index
g = fib(5)
# 用while循環(huán)和try捕獲錯(cuò)誤
while True:
try:
print(next(g))
except StopIteration as e:
print(e.value) # 返回值在錯(cuò)誤的value中
break
如果想拿返回值嘶居,必須捕獲StopIteration錯(cuò)誤罪帖,返回值包含在錯(cuò)誤對(duì)象的value屬性中。