• 生成器中yield和next()的用法解析


    生成器概念:

    python使用生成器对延迟操作提供了支持,就是需要的时候才产生结果,而不是产生结果.

    • 生成器函数:

      和其他函数编写方式相同,使用yield语句一次返回一次结果,在每个结果之间挂起当前状态,下次调用直接继续当前的状态.

    • 生成器表达式:

      类似于列表解析,不同的是他返回的是一个迭代对象而不是一个列表.

    #列表生成器:
    L = [x for x in range(5)]
    print(L)
    #简单生成器:
    G= (x for x in range(5))
    print(next(G))
    print(next(G))
    print(next(G))
    print(next(G))
    print(next(G))
    
    当我们输出结果是一个一个的输出时:
    • 1.创建一个迭代器类,把代码写进去,用类来创建可迭代对象,然后用next()函数来把结果迭代出来.
      class test_Iterator():
          def __init__(self):
              self.a=0
              self.b=1
          def __iter__(self):
              return self
          def __next__(self):
              num = self.a
              self.a,self.b=self.b,self.b+self.a
              return num
              
      itera = test_Iterator()
      print(next(itera))
      print(next(itera))
      print(next(itera))
      print(next(itera))
      print(next(itera))
      print(next(itera))
      ########################################################
      0
      1
      1
      2
      3
      5      
      
    • 2.代码函数的合适位置加上yield,这时候这个函数就变成一个生成器了
      def test():
          a = 1
          b = 2
          while True:
              yield a 
              a,b = b,a*b
      
      
      generator = test()
      
      print(next(generator))
      print(next(generator))
      print(next(generator))
      print(next(generator))
      print(next(generator))
      print(next(generator))
      print(next(generator))
      print(next(generator))
      #######################################
      1
      2
      2
      4
      8
      32
      256
      8192
      第一次用next()唤醒生成器时,从函数的开头开始运行,遇到yield a,返回a,然后暂停函数,并记住函数是运行到这个位置的。
      
      第二次唤醒生成器,从yield a断点处开始,然后a,b开始赋值,while True循环又遇见yield a,返回a,然后暂停函数,并记住函数是运行到这个位置的
      
    • 3.生成器yield接收参数,send()方法:
      #b = yield,会把yield接收的值赋值给b。
      def test():
          a = 1
          while True:
              recv = yield a
              print('接收值:',recv)
      
      
      gen = test()
      
      print(next(gen))
      print(gen.send('Jhonsenry'))
      print(gen.send('a bad guy'))
      ##############################################################################
      1
      接收值: Jhonsenry
      1
      接收值: a bad guy
      1
      
  • 相关阅读:
    手把手教你封装属于自己的分段滚动视图(上)
    从 setNeedsLayout 说起
    cocoapods使用指南
    神奇的 BlocksKit(1):源码分析(下)
    Web应用开发中的几个问题
    Jquery Ajax自定义无刷新提交表单Form
    解耦HTML、CSS和JavaScript
    通过预加载器提升网页加载速度
    巧妙使用CSS创建可以打印的页面
    有用的JavaScript开发小建议
  • 原文地址:https://www.cnblogs.com/Zhao159461/p/11416490.html
Copyright © 2020-2023  润新知