首页 > Python笔记 阅读数:19

Python程序3种控制结构的由来

在前面的章节中,我们讨论了 Python 的基本数据类型。在此基础之上,我们将开始介绍计算机程序常用的控制结构。首先,我们简要回顾一下程序控制结构的发展历史。

结构化程序设计(Structured Programming)是一种经典的编程模式,在 20 世纪 60 年代开始发展,这种思想最早是由荷兰著名计算机科学家、图灵奖得主艾兹格·W·迪科斯彻(E.W.Dijkstra)提出的。Dijkstra 设计了一套规则,使程序设计具有合理的结构,以保证程序的正确性。这套规则要求程序设计者按照一定的结构形式来设计和编写程序,而不是“天马行空”地根据自己的意愿来编写。

1966 年,Böhm 和 Jacopini 等人提出了结构化程序理论。他们的研究结论是,只要一种编程语言利用三个控制方式组合其子程序及调整控制流程,则每个可计算函数都可以用此种编程语言来表示。这三个调整控制流程的方式如下。
早期的程序员可没有结构化编程思想,他们广泛使用 GOTO 语句(即跳转到指定标签位置的一种程序控制策略)。GOTO 语句也称为无条件转移语句,它的优点在于“指哪打哪”,效率非常高。

但 GOTO 语句的缺点也很明显,那就是破坏了程序设计的结构性,导致程序流程混乱,使理解和调试程序都产生困难。1966 年 5 月,Dijkstra 在著名学术期刊 Communications of the ACM 上发表论文并指出,任何一个有 GOTO 指令的程序,都可以改为完全不使用 GOTO 指令的程序,即“所有有意义的程序流程都可以由三种基本的结构构成”。

1968年,Dijkstra 发表了著名的论文《GOTO语句有害论》(Go To Statement Considered Harmful)(见图 1)。

Dijkstra与他的经典论文《GOTO语句有害论》
图 1:Dijkstra 与他的经典论文《GOTO语句有害论》

在这篇论文中,Dijkstra 犀利地指出:“几年前我就观察到,一个程序员的质量,与其程序中 GOTO 语句的密度成反比。”他还阐述道:“后来我发现了为什么使用 GOTO 语句有这么严重的后果,并相信所有高级语言都应该把 GOTO 废除掉。”

立足现在,回望过往,我们可能觉得 Dijkstra 真是高屋建瓴,具有真知灼见。可是,你知道吗,这篇论文在盲审时也被论文评阅人批得惨不忍睹。

其中一位评阅人的意见就是:“发表这样的论文,纯粹就是浪费纸张。这样的论文,它既不会被引用,也不会被人注意。我敢肯定,从现在起的 30 论文,它既不会被引用,也不会被人注意。我敢肯定,从现在起的 30 年内,GOTO 语句不仅会活得好好的,而且还会像现在一样应用广泛。”

这段有关 Dijkstra 论文发表的小故事告诉我们,即使你是金子,也有可能有被人误解为破铜烂铁,但结局总是完美的,是金子,终究还是会发光的。

Dijkstra 的论文针砭时弊,引起了激烈的讨论。之所以激烈,是因为当时人们正忙于 IBM 360 系列大型机的研究,IBM 360 使用的主要编程语言是 Fortran,而 GOTO 语句则是 Fortran 的支柱之一。

但人们还是逐渐意识到,问题的关键不是简单地去掉 GOTO 语句,而是形成一种新的程序设计观念和风格,以期显著提高软件生产率,降低软件维护成本。

自此,人们的编程方式发生了重大变化,每种语言都提供三种基本控制结构的实现,并提供局部化数据访问的能力及某种形式的模块化编译机制。正是这个原因,在 Python 中,压根就没有提供 GOTO 这个程序控制策略。

在现代的编程设计中,不论是顺序结构、选择结构,还是循环结构,它们都有一个共同点——只有一个入口,也只有一个运行出口。在程序中,使用这些结构到底有什么好处呢?答案是,这些单一的入口、出口可以让程序可控、易读、好维护。

相关文章