WEB开发网
开发学院软件开发Python 可爱的 Python: 用基于生成器的状态机和协同程序增... 阅读

可爱的 Python: 用基于生成器的状态机和协同程序增加效率

 2007-03-29 12:05:22 来源:WEB开发网   
核心提示: 协同程序和半协同程序细心的读者可能注意到了,实际上我们不知不觉地进入了一种比最初所表明的要有用得多的流控制结构,可爱的 Python: 用基于生成器的状态机和协同程序增加效率(6),在样本代码中,不仅仅只是有了状态机,确切的说,生成器上下文(和任何上下文一样)可以自己调用其它生成器或函数

协同程序和半协同程序

细心的读者可能注意到了,实际上我们不知不觉地进入了一种比最初所表明的要有用得多的流控制结构。在样本代码中,不仅仅只是有了状态机。事实上,上面的模式是一个很有效的协同程序通用的系统。大多数读者在此或许会需要一些背景知识。

协同程序是程序功能的集合,它允许任意地分支到其它的控制上下文中 以及从分支点任意恢复流。我们在大多数编程语言中所熟悉的子例程是通用协同程序的一种极为有限的分支情况。子例程仅从顶端的一个固定点进入并且只退出一次(它不能被恢复)。子例程还总是把流传送回它的调用者处。本质上,每个协同程序代表一个可调用的延续 ― 尽管添加一个新的单词并不一定能向不知道这个单词的人阐明它的意思。Randall HydeAn 的 The Art of Assembly中的“Cocall Sequence Between Two Processes”插图对于解释协同程序大有帮助。 参考资料上有到此图的链接。参考资料中还有到 Hyde 的综合讨论的链接,该讨论相当不错。

不管算不算负面影响,您还是会注意到,在许多语言中臭名昭著的 goto 语句也允许任意分支,但是在一个不太结构化的上下文中,它能导致“通心粉 代码”。

Python 2.2+ 的生成器向协同程序迈进了一大步。这一大步是指,生成器 ― 和函数/子例程不同 ― 是可恢复的,并且可以在多个调用之后得到值。然而,Python 生成器只不过是 Donald Knuth 所描述的“半协同程序”。生成器是可恢复的,并且可以在别处分支控制 ― 但是它只能分支控制回到直接调用它的调用者处。确切的说,生成器上下文(和任何上下文一样)可以自己调用其它生成器或函数 ― 甚至可以它自己进行递归调用 ― 但是每个最终的返回必须经由返回上下文的线性层次结构传递。Python 生成器不考虑“生产者”和“消费者”的常见协同程序用法(可以随意从对方的中间位置继续)。

上一页  1 2 3 4 5 6 7  下一页

Tags:可爱 Python 基于

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接