zoukankan      html  css  js  c++  java
  • 生成器中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
      
  • 相关阅读:
    Coding Souls团队第二阶段冲刺(三)
    Coding Souls团队第二阶段冲刺(二)
    第一阶段意见评价
    PHPMailer/PHPMailer的使用
    使用jquery.media.js实现pdf在线预览
    select2(前端选择框_框架)
    安装Docker CE+阿里云镜像仓库
    docker学习
    前端开发框架WeUI
    php _Markdown转HTML
  • 原文地址:https://www.cnblogs.com/Zhao159461/p/11416490.html
Copyright © 2011-2022 走看看