需求:有的时候逻辑比较复杂,生成器推导式for循环
无法实现的时候可以选择函数生成器
# 正常的函数,遇到return语句就返回
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对象
print(next(g)) # 10
多个yield:编程generator函数,在每次调用next()的时候,遇到yield语句返回值,并且暂停;如果再次执行next从上次返回的yield语句执行到下一次的yield
def func():
yield 0
print('输出1')
yield 1
print('输出2')
yield 2
print('输出3')
yield 3
g = func()
print(g) # 输出generator对象
print(next(g)) # 0
print(next(g)) # 1
遇到yield中断,如果没有yield再继续执行,报错
练习应用:斐波那契数列 : 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,
疑问: 如果有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循环和try捕获错误
while True:
try:
print(next(g))
except StopIteration as e:
print(e.value) # 返回值在错误的value中
break
如果想拿返回值,必须捕获StopIteration错误,返回值包含在错误对象的value属性中。
网友评论