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\')))

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