本章将简要介绍计算机和编程的历史。从计算机出现以来,硬件性能得到飞跃式的发展。与此同时,编程语言也几经变迁,产生了多种编程范式。Python语言以简洁灵活的特点,在诸多编程语言中打下一片天地。通过历史,我们不但能体验Python的特色,还能了解这门语言想要解决的痛点。本章将以一个简单的“Hello World!”程序结束,从此开启Python之旅。

1.1 从计算机到编程

人能运算和记忆,但更了不起的是善于借用工具。人类很早就开始利用方法和工具,辅助计算和记忆这样高度复杂的认知活动。古人用给绳子打结的方式来记录圈养的牛羊,我们的祖先很早就能以眼花缭乱的速度使用算盘。随着近代工业化的发展,社会对计算的需求越来越强烈。收税需要计算,造机器需要计算,开挖运河也需要计算。新的计算工具不断出现。利用对数原理,人们制造出计算尺。计算尺可以平行移动尺子来计算乘除法。19世纪的英国人巴贝奇设计了一台机器,用齿轮的组合来进行高精度的计算,隐隐预示着机器计算的到来。20世纪初有了机电式的计算机器。电动马达驱动变档齿轮“咯吱”转动,直到得到计算结果。

二战期间,战争刺激了社会的计算需求。武器设计需要计算,比如坦克的设计、潜艇的外形、弹道的轨迹。社会的军事化管理需要计算,比如火车调度、资源调配、人口动员。至于导弹和核弹这样的高科技项目,更需要海量的计算。美国研制原子弹的曼哈顿计划,除了使用IBM的计算机器外,还雇佣了许多女孩子进行手工运算。计算本身甚至可以成为武器。电影《模仿游戏》就讲述了英国数学家阿兰·图灵(Alan Mathison Turing)破解德国传奇密码机的故事。图灵的主要工具,就是机电式的计算机器。值得一提的是,正是这位图灵,提出了通用计算机的理论概念,为未来的计算机发展做好了理论准备。现在,计算机学科的最高奖项就以图灵命名,以纪念他的伟大贡献。德国工程师康拉德·楚泽(Konrad Zuse)发明的Z3计算机能编写程序。这看起来已经是一台现代计算机的雏形了。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

计算工具的发展是渐进的。不过历史把第一台计算机的桂冠颁给了战后宾夕法尼亚大学研制的埃尼阿克(ENIAC,Electronic Numerical Integrator And Computer)。埃尼阿克借鉴了前任的经验,远非横空出世的奇迹。但它最重要的意义,是向人们展示了高速运算的可能性。首先它是一台符合图灵标准的通用计算机,能通过编程来执行多样的计算任务。其次,与机电式计算机器不同,埃尼阿克大量使用真空管,从而能快速运算。埃尼阿克的计算速度比之前的机电型机器提高了一千倍,这是一次革命性的飞跃。因此,即便计算辅助工具同样历史悠久,但人们仍认为埃尼阿克引领了一个新的时代—计算机时代。

从埃尼阿克开始,计算机经历了迅猛的发展。计算机所采用的主要元件,从真空管变成大规模集成电路。计算机的运算性能,每一两年的时间就会翻倍。但计算机的大体结构,都采用了冯·诺依曼体系。这一体系是长期演化的结果,但冯·诺依曼进行了很好的总结。按照冯·诺依曼的设计,计算机采用二进制运算,包括控制器、运算器、存储器、输入设备和输出设备五个部分,如图1-1所示。五个部分相互配合,执行特定的操作,即指令。这五个部分各有分工。

阅读 ‧ 电子书库

图1-1 冯·诺依曼结构

  1. 控制器:计算机的指挥部,管理计算机其他部分的工作,决定执行指令的顺序,控制不同部件之间的数据交流。
  2. 运算器:顾名思义,这是计算机中进行运算的部件。除加减乘除之类的算数运算外,还能进行与、或、非之类的逻辑运算。运算器与控制器一起构成了中央处理器(CPU,Central Processing Unit)。
  3. 存储器:存储信息的部件。冯·诺依曼根据自己在曼哈顿工程中的经验,提出了存储器不但要记录数据,还要记录所要执行的程序。
  4. 输入设备:向计算机输入信息的设备,如键盘、鼠标、摄像头等。
  5. 输出设备:计算机向外输出信息的设备,如显示屏、打印机、音响等。

人们最常想到的计算机是台式机和笔记本电脑。其实,计算机还存在于智能手机、汽车、家电等多种设备中。但无论外形如何多变,这些计算机都沿袭了冯·诺依曼结构。不过在具体细节上,计算机之间又有很大的差别。有的计算机使用了多级缓存,有的计算机只有键盘没有鼠标,有的计算机用磁带存储。计算机的硬件是一门很庞杂的学问。幸运的是,计算机用户大多不需要和硬件直接打交道。这一点是操作系统(Operating System)的功劳。

操作系统是运行在计算机上的一套软件,负责管理计算机的软硬件资源。有的时候我们请人修电脑,他可能会说“电脑需要重装一下”。这个“重装”,就是重新安装操作系统的意思。无论是微软的Windows,还是苹果的iOS,都属于操作系统。我们编程时,大多数时候都是通过操作系统这个“中间商”来和硬件打交道的。操作系统提供了一套系统调用(System Call),如图1-2所示,规定了操作系统支持哪些操作。当调用某个系统调用时,计算机会执行对应的操作。这就像是按下钢琴上的一个键,钢琴就会发出对应的音律一样。系统调用提供的功能非常基础,有时调用起来很麻烦。操作系统因此定义一些库函数(Library Routine),将系统调用组合成特定的功能,如同几个音律组成的和弦。所谓的编程,就是用这些音律和和弦,来组成一首美妙的音乐。

阅读 ‧ 电子书库

图1-2 硬件、操作系统和应用程序的关系

1.2 所谓的编程,是做什么的

编程中总是在调用计算机的基本指令。如果完全用基础指令来说明所有的操作,代码将超乎想象的冗长。IBM前总裁小沃森的自传中就提到,他看到一位工程师想要做乘法运算,输入程序用的打孔卡叠起来有1.2米高。幸好,程序员渐渐发现,许多特定的指令组合会重复出现。如果能在程序中复用这些代码,则可以节省很多工作量。复用代码的关键是封装(Packaging),即把执行特殊功能的指令打包成一个程序块,然后给这个程序块起个容易查询的名字。如果需要重复使用这个程序块,则可以简单地通过名字调用。就好像食客在点菜时,只需告诉厨师做“鱼香肉丝”,而不需要具体说明要多少肉、多少调料、烹制多久一样。刚才提到的操作系统,就是将一些底层的硬件操作组合封装起来,供上层的应用程序调用。当然,封装是有代价的,它会消耗计算机资源。如果使用的是早期的计算机的话,封装和调用的过程会非常耗时,最终得不偿失。

封装代码的方式也有很多种。根据不同的方式,程序员写程序时要遵循特定的编程风格,如面向过程编程、面向对象编程和函数式编程。用更严格的术语来说,每种编程风格都是一种编程范式(Programming Paradigm)。编程语言开始根据编程范式区分出阵营,面向过程的C语言、面向对象的Java语言、面向函数的Lisp语言等。任何一种编程范式编写出来的程序,最终都会翻译成上面所述的简单功能组合。所以编程的需求总是可以通过多种编程范式来分别实现,区别只在于这个范式的方便程度而已。由于不同的范式各有利弊,所以现代不少编程语言都支持多种编程范式,以便程序员在使用时取舍。Python就是一门多范式语言。某一范式的代表性语言,也开始在新版本中支持其他范式。原本属于面向对象范式的Java语言,就在新版本中也开始加入函数式编程的特征。

编程范式是学习编程的一大拦路虎。对于一个程序员来说,如果他熟悉了某一种编程范式,那么他就能很容易地上手同一范式的其他编程语言。对于一个新手来说,一头扎进Python这样的多范式语言,会发现同一功能有不同的实现风格,不免会感到困惑。一些大学的计算机专业课程,选择了分别讲授代表性的范式语言,比如C、Java、Lisp,以便学生在未来学习其他语言时有一个好的基础。但这样的做法,会将学习过程拉得很漫长。在我看来,Python这样的多范式语言提供了一个对比学习多种编程范式的机会。在同一语言框架下,如果程序员能清晰地区分出不同的编程范式,并了解各自的利弊,将起到事半功倍的效果。这也是本书中想要做到的,从面向过程、面向对象、函数式三种主流范式出发,在一本书的篇幅内学三遍Python。这样的话,读者将不止是学会了一门Python语言,还能为未来学习其他语言打好基础。

学习了包括Python在内的任何一门编程语言后,就打开了计算机世界的大门。通过编程,你几乎可以发挥出计算机所有的功能,给创造力提供了广阔的施展空间。想到某个需求,比如统计金庸小说中的词频,自己就能写程序解决。有了不错的想法,例如想建立一个互助学习的网站,也可以立即打开电脑动手编写。一旦学会了编程,你会发现,软件主要比拼的就是大脑和时间,其他方面的成本都极为低廉。编写出的程序还会有许多回报。可以是经济性的回报,比如获得高工资,比如创立一家上市的互联网企业。也可以是声誉性的回报,比如做出了很多人喜爱的编程软件,比如攻克了困扰编程社区的难题等。正如《黑客与画家》一书中所说,程序员是和画家一样的创作者。无穷的创造机会,正是编程的一大魅力所在。

编程是人与机器互动的基本方式。人们通过编程来操纵机器。从18世纪的工业革命开始,人们逐渐摆脱了手工业的生产方式,开始转向机器生产。机器最开始用于棉纺工业,一开始纺出的纱线质量比不上手工纺制的。但机器可以昼夜工作,不知疲倦,产量也是惊人。因此,到了18世纪末,全球大部分的棉布都变成了机器生产。如今,机器在生活中已经屡见不鲜。人工智能这样的“软性机器”,也越来越多地进入生产和生活。工人用机器来制造手机、医生操纵机器来进行微创手术、交易员用机器进行高频的股票交易。残酷一点讲,对机器的调配和占有能力,将会取代血统和教育,成为未来阶级区分的衡量标准。这也是编程教育变得越来越重要的原因。

机器世界的变化,正在改变世界的工作格局。重复性工作消亡,程序员的需求量却在不断加大。很多人都在自学编程,以便跟上潮流。幸好,编程也变得越来越简单。从汇编语言,到C语言,再到Python语言,编程语言越来越亲民。以Python为例,在丰富的模块支持下,一个功能的实现只需要寥寥几个接口的调用,不需要费太多工夫。我们之前所说的封装,也是把功能给打包成规范的接口,让别人用起来觉得简单。编程用精准的机器为大众提供了一个规范化的使用接口,无论这个接口是快速安全的支付平台,还是一个简单快捷的订票网站。这种封装和接口的思维反映在社会生活的很多方面。因此,学习编程也是理解当代生活的一个必要步骤。

1.3 为什么学Python

正如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),行尾没有分号,for和if结构中没有括号。上面的程序读起来就像一段自然的文字。

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

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

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

1991年,第一个Python编译/解释器诞生。它是用C语言实现的,能够调用C语言生成的动态链接库(3)。从一出生,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)。如果代码能被采纳,将会是极大的荣誉。罗苏姆本人的角色越来越偏重于框架的制定。如果问题太复杂,则罗苏姆会选择绕过去,也就是走捷径(cut the corner),把其留给社区的其他人解决。就连创建网站(5)、筹集基金(6)这样的事情,也有人乐于处理。社区日渐成熟,开发工作被整个社区分担。

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来编写苹果应用。无论从哪一门语言学起,最终都不会拘泥于初学的那门语言。只有博彩众家,才能让编程的创造力自由发挥。

1.4 最简单的Hello World

Python的安装很方便,可以参考本章的附录A。运行Python的方式有两种。如果你想尝试少量程序,并立即看到结果,则可以通过命令行(Command Line)来运行Python。所谓的命令行,就是一个等着你用键盘来打字的小输入栏,可以直接与Python对话。

按照附录A的方法启动命令行,就进入了Python。通常来说,命令行都会有>>>字样的提示符,提醒你在提示符后面输入。你输入的Python语句会被Python的解释器(interpreter)(7)转化成计算机指令。我们现在执行一个简单的操作:让计算机屏幕显示出一行字。在命令行提示符后面输入下列文字,并按键盘上的回车键(Enter)确认:


>>>print("Hello World!")

可以看到,屏幕上会随后显示:


Hello World!

输入的print是一个函数的名称。函数有特定的功能,print()函数的功能就是在屏幕上打印出字符。函数后面有一个括号,里面说明了想要打印的字符是"Hello World! "。括号里的一对双引号并没有打印在屏幕上。这一对双引号的作用是从print之类的程序文本中出标记出普通字符,以免计算机混淆。也可以用一对单引号替换双引号。

使用Python的第二种方式是写一个程序文件(Program File)。Python的程序文件以.py为后缀,它可以用任何文本编辑器来创建和编写。附录A中说明了不同操作系统下常用的文本编辑器。创建文件hello.py,写入如下内容,并保存:


print("Hello World!")

可以看到,这里的程序内容和用命令行时一模一样。与命令行相比,程序文件适用于编写和保存量比较大的程序。

运行程序文件hello.py,可以看到Python同样在屏幕上打印出了Hello World!。程序文件的内容和命令行里敲入的内容一模一样,产生的效果也一样。与命令行直接输入程序相比,程序文件更容易保存和更改,所以常用于编写大量程序。

程序文件的另一个好处是可以加入注释(comments)。注释是一些文字,用来解释某一段程序,也方便其他程序员了解这段程序。所以,注释的内容并不会被当作程序执行。在Python的程序文件中,每一行中从#开始的文字都是注释,我们可以给hello.py加注释:


print("Hello World!") # display text on the screen

如果注释的内容较多,在一行里面放不下,那么可以用多行注释(multiline comments)的方法:


"""
Author: Vamei
Function: display text on the screen
"""
    
print('Hello World!')

多行注释的标志符是三个连续的双引号。多行注释也可以使用三个连续的单引号。两组引号之间的内容,就是多行注释的内容。

无论是想要打印的字符,还是用于注释的文字,都可以是中文。如果在Python 2中使用中文,则需要在程序开始之前加上一行编码信息,以说明程序文件中使用了支持中文的utf-8编码。在Python 3中不需要这一行信息。


# -*- coding: utf-8 -*-
    
print("你好,世界!")   # 在屏幕上显示文字

就这样,我们写出了一个非常简单的Python程序。不要小看了这个程序。在实现这个程序的过程中,你的计算机进行了复杂的工作。它读取了程序文件,在内存中分配了空间,进行了许多运算和控制,最终才控制屏幕的显像原件,让它显示出一串字符。这个程序的顺利运行,说明计算机硬件、操作系统和语言编译器都已经安装并设置好。因此,程序员编程的第一个任务,通常都是在屏幕上打印出Hello World(8)。第一次遇见Python的世界,就用Hello World和它打声招呼吧。

阅读 ‧ 电子书库

附录A Python的安装与运行

1.官方版本安装

1)Mac

Mac系统上已经预装了Python,可以直接使用。如果想要使用其他版本的Python,建议使用Homebrew安装(9)。打开终端(Terminal),在命令行提示符后输入下面命令后,将进入Python的可以互动的命令行:


$python

上面输入的python通常是一个软链接,指向某个版本的Python命令,如3.5版本。如果相应版本已经安装,那么可以用下面的方式来运行:


$python3.5

终端会出现Python的相关信息,如Python的版本号,然后就会出现Python的命令行提示符>>>。如果想要退出Python,则输入:


>>>exit()

如果想要运行当前目录下的某个Python程序文件,那么在python或python3后面加上文件的名字:


$python hello.py

如果文件不在当前目录下,那么需要说明文件的完整路径,如


$python /home/vamei/hello.py

我们还可以把Python程序hello.py改成一个可执行的脚本。只需在hello.py的第一行加上所要使用的Python解释器:


#!/usr/bin/env python

在终端中,把hello.py的权限改为可执行:


$chmod 755 hello.py

然后在命令行中,输入程序文件的名字,就可以直接使用规定的解释器运行了:


$./hello.py

如果hello.py在默认路径下,那么系统就可以自动搜索到这个可执行文件,就可以在任何路径下运行这个文件了:


$hello.py

2)Linux操作系统

Linux系统与Mac系统比较类似,大多也预装了Python。很多Linux系统下都提供了类似于Homebrew的软件管理器,例如在Ubuntu下使用下面命令安装:


$sudo apt-get install python

在Linux下,Python的使用和运行方式也和Mac系统下类似,这里不再赘述。

3)Windows操作系统

对于Windows操作系统来说,需要到Python的官方网站(10)下载安装包。如果无法访问Python的官网,那么可以通过搜索引擎查找“python Windows下载”这样的关键字,来寻找其他的下载源。安装过程与安装其他Windows软件类似。在安装界面中,选择Customize来个性化安装,除了选择Python的各个组件外,还要勾选:


Add python.exe to Path

安装好之后,就可以打开Windows的命令行,像在Mac中一样使用Python了。

2.其他Python版本

官方版本的Python主要提供了编译/解释器功能。其他一些非官方版本则有更加丰富的功能和界面,比如更加友好的图形化界面、一个针对Python的文本编辑器,或者是一个更容易使用的模块管理系统,方便你找到各种拓展模块等。在非官方的Python中,最常用的有下面两个:

1)Anaconda(11)

2)Enthought Python Distribution(EPD)(12)

相对于官方版本的Python来说,这两个版本都更容易安装和使用。在模块管理系统的帮助下,程序员还可以避免模块安装方面的恼人问题。所以非常推荐初学者使用。Anaconda是免费的,EPD则对于学生和科研人员免费。由于提供了图形化界面,因此它们的使用方法也相当直观。我强烈建议初学者从这两个版本中挑选一个使用。具体用法可以参考官方文档,这里不再赘述。

附录B virtualenv

一台计算机中可以安装多个版本的Python,而使用virtualenv则可给每个版本的Python创造一个虚拟环境。下面就使用Python附带的pip(13)来安装virtualenv:


$pip install virtualenv

你可以为计算机中某个版本的Python创建一个虚拟空间,比如:


$virtualenv –p /usr/bin/python3.5 myenv

上面的命令中,/usr/bin/python3.5是解释器所在的位置,myenv是新建的虚拟环境的名称。下面命令可开始使用myenv这个虚拟环境:


$source myenv/bin/activate

使用下面命令可退出虚拟环境:


$deactivate

————————————————————

(1) 很多语言使用{}来表示程序块,比如C、Java和JavaScript。

(2) 这部电视剧是《蒙提·派森的飞行马戏团》(Monty Python's Flying Circus)。这部英国喜剧在当时广受欢迎。蒙提·派森是主创剧团的名字。Python即来自这里的“派森”。

(3) 即.so文件。

(4) 罗苏姆充当了社区的决策者。因此,他被称为仁慈的独裁者(Benevolent Dictator For Life)。在Python早期,不少Python追随者担心罗苏姆的生命。他们甚至热情讨论:如果罗苏姆出了车祸,Python会怎样。

(5) python.org

(6) Python Software Foundation

(7) Python的解释器是一个运行着的程序。它可以把Python语句一行一行地直接转译运行。

(8) Hello World!之所以流行,是因为它被经典编程教材《C程序设计语言》用作例子。

(9) Homebrew是Mac下的软件包管理工具,其官方网址为:http://brew.sh/。

(10) Python官网:www.python.org。

(11) Anaconda官网:www.continuum.io。

(12) EPD官网:www.enthought.com/products/epd/。

(13) 将在第3章的附录部分进一步讲解pip的使用。