• Python生成器: send函数、close函数与yield关键字协作


      参考:https://blog.csdn.net/weixin_40247263/article/details/82724878

      本文讲解Python生成器的send,close函数与yield关键字协作

      

      generator的seng()函数和yield关键字

      以之前对yield关键字的了解,无非就是yield关键字可以给调用者返回消息,同时当函数通过yield关键字返回消息以后函数会暂停在当前位置。

      首先复习一下生成器yield关键字的使用

      test.py

    # 定义一个生成器生成从2开始无限翻倍的数字序列
    # 2 4 8 16 32  
    def test():
        number = 1
        while True:
            number = number * 2
            yield number
            print('我是yield关键字下面一行代码')
    
    t = test()
    print(next(t))
    # 2
    print(next(t))
    # 我是yield关键字下面一行代码
    # 4
    print(next(t))
    # 我是yield关键字下面一行代码
    # 8
    

      解析输出过程

     

     

     

     

     

     

     

     

     

     

     

       以此类推,这个生成器是无限的,如果使用for循环进行迭代则需要设置退出条件

      但其实yield关键字的作用是函数与调用者的通信,它不光能够将值返回给调用者,它还可以接收调用者传过来的值,那么怎么实现呢?调用者通过send()函数将值传递给generator,generator通过yield前面的变量来接收,示例如下:

    def test():
        number = 0
        while True:        
            n = yield number
            print('我是yield关键字下面一行代码')
            print('通过send函数传递的值是:',n)
    
    t = test()
    print(t.send(None))
    # 0
    print(t.send(1))
    # 我是yield关键字下面一行代码
    # 通过send函数传递的值是: 1
    # 0
    

      输出结果分析

     

     

     

     

     

     

     

     

     

       即执行send相当于执行了next不一样的是send可以传递参数给生成器,如果传递的参数为None则send方法等价于next方法。

      generator的close函数

      由于下面还涉及到一个 close函数,这里也演示一下,方便下面理解

    t.close()
    print(next(t))
    

      关闭generator后再调用,会出现StopIteration异常,即后面没值了。

  • 相关阅读:
    怎样让一个div高度自适应浏览器高度
    angular change the url , prevent reloading
    论习惯的重要性
    php的几个内置的函数
    cakephp 2.0 源码解读(一)
    svn switch 的用法
    浏览器兼容问题 及 解决方案 (一)
    浏览器兼容问题 及 解决方案 (二)
    promise 承诺
    ng-selected 与ng-options的使用
  • 原文地址:https://www.cnblogs.com/minseo/p/15349126.html
Copyright © 2020-2023  润新知