美文网首页
生成器(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