• Python3的生成器generator(2)


    一、生产器的方法

    在生成器开始运行后,可使用生成器和外部之间的通信渠道向它提供值。这个通信渠道包括如下两点:

    外部世界:外部世界可访问生成器的方法send,这个方法类似next,但接受一参数(要发送的“信息”,可以是任何对象)

    生成器:在挂起的生成器内部,yield可能用作表达式而不是语句。换言之,当生成器重新运行时,yield返回一个值——通过send从外部世界发送的值。如果使用的是next,yield将返回None

    注意:仅当生成器被挂起(遇见第一个yield)后,使用send(而不是next)才有意义。

       如果一定要在生成器刚启动时对其调用send方法,可向它传递参数None。

    示例1:

    1 def repeater(value):
    2     while True:
    3         new = (yield value) # 注意:此处用圆括号将yield表达式括起来了
    4         if new is not None:
    5             value = new

    调用:

    >>> r = repeater(42) # 第一次调用
    >>> next(r)
    42
    >>> r.send("Hello World") # 仅当生成器被挂起(遇见第一个yield)后,使用send(而不是next)才有意义。
    'Hello World'

    注意:

    如果要以某种方式使用返回值,就不管三七二十一,将其用圆括号括起来吧!!

    二、生成器的另外两种方法:

    throw:用于在生成器中(yield表达式处)引发异常,调用时可提供一个异常类型,一个可选值和一个traceback(回溯)对象。

    close:用于停止生成器,调用时无需提供参数。

    方法close也是基于异常的(由python垃圾收集器在需要时调用):在yield出引发GeneratorExit异常。

    因此如果要在生成器中提供一些清理代码,可将yield放在一条try/finally语句中。如果愿意,也可捕获GeneratorExit异常,但随后必须重新引发它(可能在清理后)、引发其他异常或直接返回。

    对生成器调用close后,再试图从它那里获取值将导致RuntimeError异常。

  • 相关阅读:
    【刷题-LeetCode】165 Compare Version Numbers
    python 22 内置模块2
    python 21 内置模块
    python 20 模块,包,及开发目录规范
    python 19
    python 18 三元,生成,递推
    定时抓取数据并存入数据库
    抓取财报数据
    金币
    交换座位
  • 原文地址:https://www.cnblogs.com/gepu1991/p/9152797.html
Copyright © 2020-2023  润新知