1.1历史简介
冯•诺 依曼设计:计算机采用二进制运算,包括控制器、运算器、存储器、 输入设备和输出设备五个部分。
- 控制器:计算机的指挥部,管理计算机其他部分的工作,决定执行指 令的顺序,控制不同部件之间的数据交流。
- 运算器:顾名思义,这是计算机中进行运算的部件。除加减乘除之类 的算数运算外,还能进行与、或、非之类的逻辑运算。运算器与控制 器一起构成了 中央处理器(CPU, Central Processing Unit)。
- 存储器:存储信息的部件。冯•诺依曼根据自己在曼哈顿工程中的经 验,提出了存储器不但要记录数据,还要记录所要执行的程序。
- 输入设备:向计算机输入信息的设备,如键盘、鼠标、摄像头等。
- 输出设备:计算机向外输出信息的设备,如显示屏、打印机、音响等。
操作系统是运行在计算机上的一套软件,负责管理计算机的软硬件资源。操作系统提供了一套系统调用 (System Call)。系统调用提供的功能非常基础, 有时调用起来很麻烦。操作系统因此定义一些库函数(LibraryRoutine), 将系统调用组合成特定的功能,如同几个音律组成的和弦。所谓的编程, 就是用这些音律和和弦,来组成一首美妙的音乐。
1.2所谓的编程,是做什么的
编程中总是在调用计算机的基本指令。如果完全用基础指令来说明所有的操作,代码将超乎想象的冗长,复用代码的关键是封装(Packaging),即把执行特殊功能的指令打包成一个程序块,给这个程序块起个容易查询的名字。如果需要重复使用这个程序块,简单地通过名字调用。
操作系统就是将一些底层的硬件操作组合封装起来,供上层的应用程序调用。当然,封装是有代价的,它会消耗计算机资源。如果使用的是早期的计算机的话,封装和调用的过程会非常耗时,最终得不偿失。
封装代码的方式也有很多种。根据不同的方式,程序员写程序时要遵循特定的编程风格,如面向过程编程、面向对象编程和函数式编程。用更严格的术语来说,每种编程风格都是一种编程范式(Programming Paradigm)。面向过程的C语言、 面向对象的Java语言、面向函数的Lisp语言等。
对于一个程序员来说,如果他熟悉了某一种编程范式,那么他就能很容易地上手同一范式的其他编程语言。Python这样的多范式语言提供了一个对比学习多种编程范式的机会。在同一语言框架下,如果程序员能清晰地区分出不同的编程范式,并了解各自的利弊,将起到事半功倍的效果。这也是本书中想要做到的,从面向过程、面向对象、函数式三种主流范式出发,为未来学习其他语言打好基础。
1.3为什么学Python
在编写Python之前,罗苏姆接触并使用过诸如Pascal、C、Fortran 等语言。这些语言的关注点是让程序更快运行。相对于C语言,罗苏姆更喜欢Shell实现功能的方 式。UNIX系统的管理员们常常用Shell去写一些简单的脚本,以进行一 些系统维护的工作,比如定期备份、文件系统管理,等等。Shell可以像胶水一样,UNIX下的许多功能连接在一起。许多C语言下数百行的程序,在Shell只用几行就可以完成。然而,Shell的本质是调用命令, 它并不是一个真正的语言。比如说,Shell数据类型单一、运算复杂等。 总之,Shell不是一个合格的通用程序语言。
尽管已经具备了良好的可读性和易用性,但ABC语言并未流行起来。 在当时,ABC语言编译器需要比较高配置的电脑才能运行。除了性能,ABC语言的设计还存在一些致 命的问题:
•可拓展性差。ABC语言不是模块化语言。如果想在ABC语言中增加功能,比如对图形化的支持,就必须改动很多地方。
•不能直接进行输入输出。ABC语言不能直接操纵文件系统。尽管你可以通过诸如文本流的方式导入数据,但ABC语言无法直接读写文件。输入输出的困难对于计算机语言来说是致命的。你能想像一个打不开车门的跑车么?
·过度革新 ·传播困难
1991年,第一个Python编译/解释器诞生。它是用C语言实现的, 能够调C语言生成的动态链接库。从一出生,Python就已经具有了一 直保持到现在的基本语法:类(class)、函数(fimction)、异常处理(exception)、包括表(list)和词典(dictionary)在内的核心数据类型, 以及模块(module)为基础的拓展系统。
python用缩进代替花括号,从而保证程序更易读(readability)o 罗苏姆认为,程序员读代码的时间要远远多于写代码的时间。强制缩进能让代码更清晰易读,应该予以保留。但与ABC语言不同的是,罗苏姆同样重视实用性(practicality),在保证易读性的前提下,Python会乖巧 地服从其他语言中已有的一些语法惯例。Python用等号赋值,与多数语言保持一致。它使用def来定义函数,而不是像ABC语言那样使用生僻 的HOW TO。
Python还特别在意可拓展性(extensibility),这是罗苏姆实用主义原则的又一体现。Python可以在多个层次上拓展。从高层上,你可以引入其他人编写的Python文件,来为自己的代码拓展功能。如果出于性能考虑,你还可以直接引入C和C++语言编译出的库。由于C和C++语言在代码方面的多年储备,Python相当于站在了巨人的肩膀上。Python就像是使用钢构建房一样,先规定好大的框架,再借着模块系统给程序员以 自由发挥的空间。
Python的流行与计算机性能的大幅提高密不可分。那些能快速生产出软件的语言成为新的明星,比如运行在虚拟机上的Java完全基于面向对象的编程范式,能在牺牲性能的代价下,提高程序的产量。Python的步伐落 后于Java,但它的易用性同样符合时代潮流。
另一个悄然发生的改变是互联网。开源 (Open Source)的软件开发模式变得流行。程序员利用业余时间进行软件开发,并开放源代码。Linux和GNU相互合作,最终构成了一个充满活力的开源平台。
Python的一个理念是自带电池(Battery Included)也就是说,Python 已经有了功能丰富的模块。所谓模块,就是别人已经编写好的Python程序,能实现一定的功能。一个程序员在编程时不需要重复造轮子,只需 引用已有的模块即可。这些模块既包括Python自带的标准库,也包括了 标准库之外的第三方库。这些“电池”同样是整个社区的贡献。
当然,由于很多现存的代码是Python 2编写的, 所以从版本2到版本3的过渡并不容易。Python的性能也不时被人诟病。Python的运算性能低 于C和C++,我们会在本书中提及其原因。尽管Python也在提高自身的性能,但性能的差距会一直存在。
1.4 最简单的 Hello World
命令行 (Command Line)来运行Python。你输入的Python 语句会被Python的解释器(interpreter)转化成计算机指令。
使用Python的第二种方式是写一个程序文件(Program File)。Python 的程序文件以.py为后缀,它可以用任何文本编辑器来创建和编写。
一模一样。与命令行相比, 程序文件适用于编写和保存量比较大的程序。
程序文件的另一个好处是可以加入注释(comments)#。多行注释(multiline comments ) 连续三个引号。
无论是想要打印的字符,还是用于注释的文字,都可以是中文。如 果Python 2中使用中文,则需要在程序开始之前加上一行编码信息, 以说明程序文件中使用了支持中文的utf-8编码。在Python 3中不需要这 一行信息。
# coding: utf-8
print("你好,世界! ”) #在屏幕上显示文字