资讯专栏INFORMATION COLUMN

【generator101】 - generator的输入与输出

melody_lql / 2576人阅读

摘要:的是可以有输入输出的,这个特性并不广为人知。也就是要求不返回值,而是抛出给定的异常。执行之后的输出与前面是一样的。

Python的generator是可以有输入输出的,这个特性并不广为人知。这其实是一个挺有用的特性,利用其外部可控制执行进度的特性,再加上可以与外部进行输入输出,generator可以被用来打造成一个异步执行框架,或者说是协程调度引擎。
我们先来看一个最简单的例子,generator如何接受外部的输入

def demo_input_and_output():
    input = yield "please give me a input"
    yield input

gen = demo_input_and_output()
print(gen.next())
print(gen.send("this is your input"))

这段代码的输出是

please give me a input
this is your input

其中第一个gen.next()是执行第一个yield,第二个gen.send是给第一个yield一个返回值,也就是外部传递给generator的输入,同时执行第二个yield。我们可以把next()理解为一种特殊情况的send(),也就是给的输入是None,下面是一段等价的代码:

def demo_input_and_output():
    input = yield "please give me a input"
    yield input

gen = demo_input_and_output()
print(gen.send(None))
print(gen.send("this is your input"))

输入除了值之外,还可以是异常。也就是要求yield不返回值,而是抛出给定的异常。

def demo_input_and_output():
    try:
        yield "please give me a input"
    except RuntimeError as e:
        yield e.message

gen = demo_input_and_output()
print(gen.next())
print(gen.throw(RuntimeError, RuntimeError("this is your input")))

执行之后的输出与前面是一样的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37380.html

相关文章

  • generator101】 - 对比generator和greenlet

    摘要:比如里可以直接把执行权交给,而完全不知情。虽然不能和多线程相比,但是效果是类似的。对于多线程的代码,是任何一行代码都可能与其他线程并行。加上协程之间有共享状态的话,一定程度上会产生类似多线程的并发读写状态的。 前面讲generator是显式的协程的时候缺一个例子,现在补上 def parent_generator(): print(hello) yield from ...

    CoyPan 评论0 收藏0
  • generator101】- generator是可以被外部控制执行进度函数

    摘要:协程是用来处理阻塞和流程阻塞这两个普世问题的得力工具,可以达到比较好的。这段代码执行的输出是通过这个例子,可以了解到的的两个特性。被调用一次,函数就往前执行一步。通过控制,可以从外面控制函数内部的执行进度。 很多码农终其一生可能在代码上干的事情无非就是追求两件事情:Logic Locality 和 Data Locality。前者决定了开发效率,后者决定了运行效率。协程是用来处理I/O...

    yacheng 评论0 收藏0
  • generator101】 - yield from

    摘要:我们可以看一下的可见是由内部支持的,其实现原理上就避免了栈进栈出的消耗,直接由最内层的返回值。另外可以实现外部直接向最内层的传递值,比如这段代码的输出是这样传值的方式,在用循环重新的模式下是无法实现的。这也就是必须使用,而不能使用的原因。 在python 3.3里,generator新增了一个语法 yield from 这个yield from的作用是什么?看下面两段对比的代码: d...

    xiaodao 评论0 收藏0
  • python 学习笔记-列表生成器

    摘要:定义列表生成器有两种方式,一种是算式列表生成器我起的名字,一种通过关键词。算式列表生成器算式列表生成器雨列表生成式类似,但需要换成。我们可以用一个包含关键字的函数来定义一个列表生成器。 通过列表生成式我们可以方便的生成列表。但是在有的时候,我们需要生成的列表非常长,而我们的计算机的内存是有限的。在操作列表的时候,我们往往只是操作了列表的一部分区域的数据。 例如我们需要生成这么一个列表,...

    MyFaith 评论0 收藏0
  • generator101】 - stacklessapi

    摘要:如果说相比来说,是一种隐式的协程的话,提供的就更加隐式了。通过调用可以知道这个链表目前的大小。正式因为没有把底层的协程直接控制接口开放,而是强买强卖了一个,所以想要在像那样随心所欲的操纵协程还是颇费一番周折的。 如果说greenlet相比generator来说,是一种隐式的协程的话,stackless python提供的api就更加隐式了。 import stackless def...

    philadelphia 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<