接收和发出返回值的Python协同程序

时间:2015-07-22 06:35:02

标签: python python-2.7 functional-programming

我正在阅读Python Essential Reference,我无法理解接收和发出返回值的协同程序。

这是作者所说的 - “如果在yield表达式中提供了值,则协程可以使用yield同时接收和发出返回值。”

以下示例说明了这一点:

def line_splitter(delimiter=None):
    print("Ready to split")
    result = None
    while True:
        line = (yield result)
        result = line.split(delimiter)

此外,作者补充道, 在这种情况下,我们以与以前相同的方式使用协同程序。但是,现在打电话给 send()也会产生结果。例如:

>>> s = line_splitter(",")
>>> s.next()
Ready to split
>>> s.send("A,B,C")
['A', 'B', 'C' ]
>>> s.send("100,200,300")
['100', '200', '300']

我想知道上面的代码是如何工作的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

让我们一行一行地看看调用代码的作用:

  • s = line_splitter(",")这一行只是初始化生成器,没有执行其中的任何代码。
  • s.next()这会执行代码,包括下一个yield语句,打印该行并产生None。但是,作业result = ...尚未执行
  • s.send("A,B,C")这会将生成器中的yield 的“值”设置为"A,B,C",并执行代码,包括下一个{{1} },从而将其分配给yield

从某种意义上说,result关键字可用于两者,获取生成器的值 out (使用yield)并同时注入值进入生成器(使用next)。

要获得更深入的解释,您还可以查看this answer