生成器
使用yield语句,可以让函数生成一个结果序列,而不仅仅是一个值。
如上,next()调用使生成器函数一直运行到下一条yield语句为止。此时next()将返回值传递给yield,而且函数将暂时中止执行。再次执行next()时,函数将继续执行yield之后的语句。此过程持续到函数返回为止。
通常不会像上面手动调用next(),使用for循环
生成器是基于处理管道、流、数据流编写程序的一种极其强大的方式。
如上创建了一个简单的处理管道程序,生成器的微妙之处在于经常和其他可迭代的对象一起混用,这在创建可扩展的程序时可以发挥巨大的作用。
协程
函数运行时需要使用一组输入参数。可以把函数编写成一个任务,从而能处理发送给它的一系列的输入。这类函数叫做协程。可使用一yield语句并以表达式(yield)的形式创建协程,如下所示:
使用这个函数,首先要调用它,向前执行到第一条yield语句,然后使用send()给它发送数据例如:
使用send()为协程发送某个值之前,协程会暂时的中止,此时,协程中的yield表达式将会返回这个值,而接下来的语句将会处理它。处理直到遇到下一个yield表达式才会结束,也就是函数暂时中止的地方。