美文网首页
生成器(2)函数

生成器(2)函数

作者: 夕阳_好 | 来源:发表于2020-05-06 18:00 被阅读0次

需求:有的时候逻辑比较复杂,生成器推导式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属性中。

相关文章

网友评论

      本文标题:生成器(2)函数

      本文链接:https://www.haomeiwen.com/subject/pqbightx.html