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

use*_*333 4 python functional-programming python-2.7

我正在阅读 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)
Run Code Online (Sandbox Code Playgroud)

作者进一步补充说,在这种情况下,我们以与以前相同的方式使用协程。但是,现在对 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']
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助。

tob*_*s_k 5

让我们一行一行地看看调用代码做了什么:

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

从某种意义上说,yield关键字既可以用于生成器中获取值(使用next),也可以同时将值注入生成器中(使用send)。

要获得更深入的解释,您也可以查看此答案