10.7 【并发编程】从 yield 开始入门协程 ====================================== 简单介绍 yield -------------- 本篇文章会先向你介绍一个陌生的 Python 关键词,他和 ``return`` 就像一对新兄弟,有相似之处,又各有不同。 - **相似的是**\ :yield 和 return 都可以在一个函数里将值返回给调用方; - **不同的是**\ :return 后,函数运行就终止了,而 yield 则只是暂停运行。 关于 yield 的简单使用,请先看如下例子 .. code:: python >>> def demo(): ... yield 1 ... yield 2 ... yield 3 ... >>> gen = demo() >>> gen >>> >>> >>> for i in gen: ... print(i) ... 1 2 3 重点有如下几个: 1. 含有 yield 的函数,不再是普通的函数,直接调用含有 yield 的函数,返回的是一个生成器对象(generator object) 2. 可以使用 for 循环(实际还可以使用 list 或者 next 函数)来遍历该生成器对象,将 yield 的内容一个一个打印出来 更多关于 yield 和生成器的内容,请前往前面的文章,里面有非常详细的讲解:\ `3.6 【基础】生成器 `__ 向生成器中发送消息 ------------------ 函数暂停之后,如果调用者能在下一次恢复函数运行的时候,向它传递一些信息,那么整个程序的灵活性会大大提升。 下面通过一个简明的演示来看看,如何往生成器中发送消息: .. code:: python def jumping_range(N): index = 0 while index < N: # 通过send()发送的信息将赋值给jump jump = yield index if jump is None: jump = 1 index += jump if __name__ == '__main__': itr = jumping_range(5) print(next(itr)) print(itr.send(2)) print(next(itr)) print(itr.send(-1)) 输出。 :: 0 2 3 2 这里解释下为什么这么输出。 重点是\ ``jump = yield index``\ 这个语句。 分成两部分: - ``yield index`` 是将index ``return``\ 给外部调用程序。 - ``jump = yield`` 可以接收外部程序通过send()发送的信息,并赋值给\ ``jump`` 下一节,我将讲一个Python3.5新引入的语法:\ ``yield from``\ 。篇幅也比较多,所以就单独拿出来讲。