zoukankan      html  css  js  c++  java
  • 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异常。

  • 相关阅读:
    weak_ptr解决shared_ptr环状引用所引起的内存泄漏[转]
    如何限制对象只能建立在堆上或者栈上(转载)
    为了异常安全(swap,share_ptr)——Effecive C++
    注意类型转换——Effective C++
    http协议
    【java.math.BigInteger】常用函数
    【java.math.BigInteger】【转】常见问题
    【思路,dp,BigInteger】ZOJ
    【Warshall_Floyd】
    【Dijkstra】
  • 原文地址:https://www.cnblogs.com/gepu1991/p/9152797.html
Copyright © 2011-2022 走看看