返回介绍

1.3 为什么学 Python

发布于 2023-06-02 10:04:35 字数 34820 浏览 0 评论 0 收藏 0

正如1.2节所说,高级语言的关键是封装,让程序编写变得简单。Python正是因为在这一点上做得优秀,才成为主流编程语言之一。Python的使用相当广泛,是Google的第三大开发语言,也是Dropbox、Quora、Pinterest、豆瓣等网站主要使用的语言。在很多科研领域,如数学、人工智能、生物信息、天体物理等,Python都应用广泛,渐有一统天下的势头。当然,Python的成功并非一蹴而就。它从诞生开始,已经经历了二三十年的发展。回顾Python的历史,我们不但可以了解Python的发展历程,还能理解Python的哲学和理念。

Python的作者是吉多·范·罗苏姆(Guido von Rossum)。罗苏姆是荷兰人。1982年,他从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕士学位。然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣。用他的话说,尽管拥有数学和计算机双料资质,但他总是趋向于做计算机相关的工作,并热衷于做任何和编程相关的活儿。

在编写Python之前,罗苏姆接触并使用过诸如Pascal、C、Fortran等语言。这些语言的关注点是让程序更快运行。在20世纪80年代,虽然IBM和苹果已经掀起了个人电脑浪潮,但这些个人电脑的配置在今天看来十分低下。早期的苹果电脑只有8MHz的CPU主频和128KB的内存,稍微复杂一点的运算就能让电脑死机。因此,当时编程的核心是优化,让程序能够在有限的硬件性能下顺利运行。为了增进效率,程序员不得不像计算机一样思考,以便能写出更符合机器口味的程序。他们恨不得用手榨取计算机的每一寸能力。有人甚至认为C语言的指针是在浪费内存。至于我们现在编程经常使用的高级特征,如动态类型、内存自动管理、面向对象等,在那个时代只会让电脑陷入瘫痪。

然而,以性能为唯一关注点的编程方式让罗苏姆感到苦恼。即使他在脑子中清楚知道如何用C语言来实现一个功能,但整个编写过程仍然需要耗费大量的时间。相对于C语言,罗苏姆更喜欢Shell实现功能的方式。UNIX系统的管理员们常常用Shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理,等等。Shell可以像胶水一样,将UNIX下的许多功能连接在一起。许多C语言下数百行的程序,在Shell下只用几行就可以完成。然而,Shell的本质是调用命令,它并不是一个真正的语言。比如说,Shell数据类型单一、运算复杂等。总之,Shell不是一个合格的通用程序语言。

罗苏姆希望有一种通用程序语言,既能像C语言那样调用计算机所有的功能接口,又能像Shell那样轻松地编程。最早让罗苏姆看到希望的是ABC语言。ABC语言是由荷兰的数学和计算机研究所(Centrum Wiskunde & Informatica)开发的。这家研究所是罗苏姆上班的地方,因此罗苏姆正好能参与ABC语言的开发。ABC语言以教学为目的。与当时的大部分语言不同,ABC语言的目标是“让用户感觉更好”。ABC语言希望让语言变得容易阅读、容易使用、容易记忆和容易学习,以此来激发人们学习编程的兴趣。比如,下面是一段来自维基百科的ABC程序,这个程序用于统计文本中出现的词的总数:


HOW TO RETURN words document:
    PUT {} IN collection
    FOR line IN document:
    FOR word IN split line:
        IF word not.in collection:
            INSERT word IN collection
    RETURN collection

HOW TO用于定义一个函数,ABC语言使用冒号和缩进来表示程序块^(1)^{#ch1-back},行尾没有分号,for和if结构中没有括号。上面的程序读起来就像一段自然的文字。

尽管已经具备了良好的可读性和易用性,但ABC语言并未流行起来。在当时,ABC语言编译器需要比较高配置的电脑才能运行。在那个时代,高配置电脑是稀罕物,其使用者往往精通计算机。这些人更在意程序的效率,而非语言的学习难度。除了性能,ABC语言的设计还存在一些致命的问题:

  • 可拓展性差。ABC语言不是模块化语言。如果想在ABC语言中增加功能,比如对图形化的支持,就必须改动很多地方。
  • 不能直接进行输入输出。ABC语言不能直接操纵文件系统。尽管你可以通过诸如文本流的方式导入数据,但ABC语言无法直接读写文件。输入输出的困难对于计算机语言来说是致命的。你能想像一个打不开车门的跑车么?
  • 过度革新。ABC语言用自然语言的方式来表达程序的含义,比如上面程序中的HOW TO(如何)。然而对于掌握了多种语言的程序员来说,他们更习惯用function或者define来定义一个函数。同样,程序员也习惯了用等号(=)来分配变量。革新尽管让ABC语言显得特别,但实际上增加了程序员的学习难度。
  • 传播困难。ABC编译器很大,必须被保存在磁带(tape)上。罗苏姆在学术交流时,就必须用一个大磁带来给别人安装ABC编译器。这使得ABC语言很难快速传播。

1989年,为了打发圣诞节假期,罗苏姆开始写Python语言的编译/解释器。Python这个词在英文中的意思是蟒蛇。但罗苏姆选择这个名字的原因与蟒蛇无关,而是来源于他挚爱的一部电视剧^(2)^{#ch2-back}。他希望这个新的叫作Python的语言,能实现他的理念。也就是一种在C和Shell之间,功能全面、易学易用、可拓展的语言。罗苏姆作为一名语言设计爱好者,已经有过设计语言的的尝试。虽然上次的语言设计并不成功,但罗苏姆依然乐在其中。这一次设计Python语言,也不过是他又一次寻找乐趣的小创造。

1991年,第一个Python编译/解释器诞生。它是用C语言实现的,能够调用C语言生成的动态链接库^(3)^{#ch3-back}。从一出生,Python就已经具有了一直保持到现在的基本语法:类(class)、函数(function)、异常处理(exception)、包括表(list)和词典(dictionary)在内的核心数据类型,以及模块(module)为基础的拓展系统。

图1-3 最初的Python图标

Python语法很多来自C,但又受到ABC语言的强烈影响。Python像ABC语言一样,比如用缩进代替花括号,从而保证程序更易读(readability)。罗苏姆认为,程序员读代码的时间要远远多于写代码的时间。强制缩进能让代码更清晰易读,应该予以保留。但与ABC语言不同的是,罗苏姆同样重视实用性(practicality)。在保证易读性的前提下,Python会乖巧地服从其他语言中已有的一些语法惯例。Python用等号赋值,与多数语言保持一致。它使用def来定义函数,而不是像ABC语言那样使用生僻的HOWTO。罗苏姆认为,如果是“常识”上已确立的东西,就没有必要过度创新。

Python还特别在意可拓展性(extensibility),这是罗苏姆实用主义原则的又一体现。Python可以在多个层次上拓展。从高层上,你可以引入其他人编写的Python文件,来为自己的代码拓展功能。如果出于性能考虑,你还可以直接引入C和C++语言编译出的库。由于C和C++语言在代码方面的多年储备,Python相当于站在了巨人的肩膀上。Python就像是使用钢构建房一样,先规定好大的框架,再借着模块系统给程序员以自由发挥的空间。

最初的Python完全由罗苏姆本人开发。由于Python隐藏了许多机器层面上的细节,并凸显出了逻辑层面的编程思考,所以这个好用的语言得到了罗苏姆同事的欢迎。同事们在工作中乐于使用Python,然后向罗苏姆反馈使用意见,其中不少人都参与到语言的改进。罗苏姆和他的同事构成了Python的核心团队,他们将自己大部分的业余时间都奉献给了Python。Python也逐渐从罗苏姆的同事圈传播到其他科研机构,慢慢用于学术圈之外的程序开发。

Python的流行与计算机性能的大幅提高密不可分。20世纪90年代初,个人计算机开始进入普通家庭。英特尔发布了486处理器,成为第四代处理器的代表。1993年,英特尔又推出了性能更好的奔腾处理器。计算机的性能大大提高。程序员不必再费尽心力提高程序效率,开始越来越关注计算机的易用性。微软发布Windows 3.0开始的一系列视窗系统,用方便的图形化界面吸引了大批普通用户。那些能快速生产出软件的语言成为新的明星,比如运行在虚拟机上的Java。Java完全基于面向对象的编程范式,能在牺牲性能的代价下,提高程序的产量。Python的步伐落后于Java,但它的易用性同样符合时代潮流。前面说过,ABC语言失败的一个重要原因是硬件的性能限制。从这方面来说,Python要比ABC语言幸运许多。

另一个悄然发生的改变是互联网。20世纪90年代还是个人电脑的时代,微软和英特尔挟PC以令天下,几乎垄断了个人电脑市场。当时,大众化的信息革命尚未到来,但对于近水楼台的程序员来说,互联网已经是平日里常用的工具。程序员率先使用互联网进行交流,如电子邮件和新闻组。互联网让信息交流成本大大降低,也让有共同爱好的人能够跨越地理限制聚合起来。以互联网的通信能力为基础,开源(Open Source)的软件开发模式变得流行。程序员利用业余时间进行软件开发,并开放源代码。1991年,林纳斯·托瓦兹在comp.os.minix新闻组上发布了Linux内核源代码,吸引了大批程序员加入开发工作,引领了开源运动的潮流。Linux和GNU相互合作,最终构成了一个充满活力的开源平台。

罗苏姆本人也是一位开源先锋,他维护了一个邮件列表,并把早期的Python用户都放在里面。早期Python用户就可以通过邮件进行群组交流。这些用户大多都是程序员,有相当优秀的开发能力。他们来自许多领域,有不同的背景,对Python也提出了各种各样的功能需求。由于Python相当开放,又容易拓展,所以当一个人不满足于现有功能时,他很容易对Python进行拓展或改造。随后,这些用户将改动发给罗苏姆,由他决定是否将新的特征加入到Python中^(4)^{#ch4-back}。如果代码能被采纳,将会是极大的荣誉。罗苏姆本人的角色越来越偏重于框架的制定。如果问题太复杂,则罗苏姆会选择绕过去,也就是走捷径(cut the corner),把其留给社区的其他人解决。就连创建网站^(5)^{#ch5-back}、筹集基金^(6)^{#ch6-back}这样的事情,也有人乐于处理。社区日渐成熟,开发工作被整个社区分担。

Python的一个理念是自带电池(Battery Included)。也就是说,Python已经有了功能丰富的模块。所谓模块,就是别人已经编写好的Python程序,能实现一定的功能。一个程序员在编程时不需要重复造轮子,只需引用已有的模块即可。这些模块既包括Python自带的标准库,也包括了标准库之外的第三方库。这些“电池”同样是整个社区的贡献。Python的开发者来自于不同领域,他们将不同领域的优点带给Python。Python标准库中的正则表达(regular expression)参考了Perl,函数式编程的相关语法则参考了Lisp语言,两者都来自于社区的贡献。Python在简明的语法框架下,提供了丰富的武器库。无论是建立一个网站,制作一个人工智能程序,还是操纵一个可穿戴设备,都可以借助已有的库再加上简短的代码实现。这恐怕是Python程序员最幸福的地方了。

当然,Python也有让人痛苦的地方。Python当前最新的版本是3,但Python 3与Python 2不兼容。由于很多现存的代码是Python 2编写的,所以从版本2到版本3的过渡并不容易。许多人选择了继续使用Python 2。有人开玩笑说,Python 2的版本号会在未来增加到2.7.31415926。除了版本选择上的问题,Python的性能也不时被人诟病。Python的运算性能低于C和C++,我们会在本书中提及其原因。尽管Python也在提高自身的性能,但性能的差距会一直存在。不过从Python的发展历史来看,类似的批判其实是吹毛求疵。Python本身就是用性能来交换易用性,走的就是和C、C++相反的方向。说一个足球前锋的守门技术不好,并没有太大的意义。

对于初学编程的人来说,从Python开始学习编程的好处很多,如上面已经提到的语法简单和模块丰富。国外许多大学的计算机导论课程,都开始选择Python作为课程语言,替代了过去常用的C或Java。但如果把Python当作所谓的“最好的语言”,希望学一门Python就成为“万人敌”,则是一种幻想。每个语言都有它优秀的地方,但也有各种各样的缺陷。一个语言“好与不好”的评判,还受制于平台、硬件、时代等外部原因。更进一步,很多开发工作需要特定的语言,比如用Java来编写安卓应用,用Objective-C或Swift来编写苹果应用。无论从哪一门语言学起,最终都不会拘泥于初学的那门语言。只有博彩众家,才能让编程的创造力自由发挥。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文