Python3从入门到实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

上篇 Python语法与实践

第1章 Python介绍

1.1 程序与编程语言

1.1.1 计算机是什么

计算机是一种根据指令对数据进行处理的通用计算设备。每台计算机都有一个称为“中央处理单元(CPU)”的微处理器芯片用于执行对数据进行处理的指令,不同计算机的指令集是不一样的。

1.计算机指令

计算机接收一系列指令作为输入,然后逐个处理它们,最后输出某些信息以显示它已完成的操作。这一过程类似人们日常生活中通过一系列操作步骤完成一个任务的过程。例如,一个人通过下列步骤完成“做饭”的任务:

从容器(米桶)中取出米,放入洗米盆;
用水对洗米盆中的米进行冲洗;
如果电饭煲没洗净
    清空并洗净电饭煲;
打开电饭煲的盖子,将米和水放入电饭煲;
插上电源,按下开关;
饭做好后,拔下电源(任务结束)。

虽然人们可以理解自然语言(如英语)中的复杂指令,但计算机只能理解用计算机语言表达的非常简单的机器指令集中的指令。无论多么复杂的计算,在计算机内都会被分解成许多条简单的可逐条执行的机器指令。告诉计算机如何执行复杂任务的指令序列称为程序

以下是一些简单的计算机指令示例。

● 算术:加、减、乘或除。执行这些指令的操作称为算术操作(运算)。

● 比较:比较两个数字,查看哪个值更大,或者它们是否相等。执行这些指令的操作称为逻辑操作(运算)。

● 分支:跳转到程序的其他指令处,并从那里继续运行程序。执行这些操作的指令称为控制语句

2.计算机的组成部分

计算机包含以下四种主要类型的组件或设备。

● 输入设备:允许计算机从用户处接收信息的设备,包括键盘、鼠标、扫描仪和麦克风。

● 处理组件:处理信息的计算机组件。计算机的主要处理组件是中央处理单元(CPU),但在现代计算机中也可能有其他处理单元。例如,许多图形卡都带有图形处理单元(GPU), GPU以前只用于处理图形,但现在也可用于处理通用程序。

● 存储组件:存储信息的组件,包括主存储器(也称“内存”)和二级存储器(如硬盘驱动器、CD或闪存盘等外部存储器)。存储组件是存储程序的指令和数据的地方。

● 输出设备:用于向用户显示信息的任何设备,包括显示器、扬声器和打印机。

可以用自动售票机来理解计算机的组件或设备(尽管自动售票机严格地讲并不是计算机)。

● 输入设备:投币口和选择按钮是自动售票机的输入设备。

● 处理组件:当使用者进行选择时,自动售票机执行的操作包括验证是否有满足条件的票;验证身份信息;检查和验证是否收到足够的资金;修改数据库;计算差额。执行所有这些操作的机器部分可以看作处理组件。

● 输出设备:显示结果;打印票据;退回多余资金。

● 存储组件:保存销售数据及价格等信息。

3.中央处理单元(CPU)

CPU是计算机中最重要的部分,是计算机的“大脑”,主要负责计算、处理数据、控制其他设备等工作。它有以下几个重要的子组件。

● 算术/逻辑单元(ALU):执行算术和比较运算。

● 控制单元:确定下一个要执行的指令。

● 寄存器:形成一个高速存储区以保存临时的运行结果。

不同种类的CPU可以处理不同的指令集,如Intel IA-32、x86-64、IBM PowerPC或ARM等。

4.存储器(Memory)

计算机将信息(程序、数据)存储在存储器中,存储器分为两类,主存储器(也称内存)和辅助存储器(也称外存)。

主存储器直接连接CPU(或其他处理单元),通常称为随机存取存储器(RAM)。计算机关闭时,大多数主存储器都会丢失其内容,即具有“易失性”。

可以将主存储器看作一组一排乘一列的存储器单元,每个存储器单元都可以通过其存储器地址寻址。第一个单元的地址为零,并且每个后续单元的地址比它之前的地址多一个,正如一个班级的学生的学号从1开始依次递增一样。每个存储器单元只能保存长度固定的用二进制表示的数值,但CPU可以随时用新的数值替换原有数值。

辅助存储器比主存储器价格便宜,但可以存储更多内容。虽然辅助存储器的存储速度比主存储器慢得多,但它是非易失性的,也就是说,即使在计算机关闭后其保存的信息也会保留,如硬盘和闪存盘。

计算机的操作系统提供操作辅助存储器的高级接口,这些接口允许信息以文件的形式保存在辅助存储器中,并且文件组织呈目录式的层级结构。接口和层级结构通常称为“文件系统”。

1.1.2 计算机编程

1.算法(Algorithms)

算法是完成某个任务或解决某个问题的一系列步骤(指令)。

2.编程和程序

编程就是使用计算机的指令来表示算法,即将算法转换为计算机可以执行的程序。程序就是算法在计算机中的表示和实现。

3.二进制

因为计算机硬件是由很多晶体管元器件组成的,而晶体管元器件只有“开”和“关”两种状态,所以1个晶体管只能表示两个数字:0和1。通过多个表示0或1的晶体管元器件可以组合出更复杂的数值,如整数或字符等。无论多么复杂的程序数据,在计算机硬件中都是以二进制(0和1)的形式表示的。

1个晶体管元器件只能表示1位二进制数(0或1),称为1比特(Bit),简记为b或1位。8个晶体管元器件可以表示8位二进制数字,即可表示28个不同的数值。8位二进制数,称为1字节(Byte,简记为B)。16个晶体管元器件可以表示16位二进制数,即2B。

8×1024个晶体管元器件可以表示1024B,即1KB。
8×1024×1024个晶体管元器件可以表示1024KB,即1MB。
8×1024×1024×1024个晶体管元器件可以表示1024MB,即1GB。

4.机器语言(machine language)

计算机中的指令和数据都是用0和1表示的。机器语言是用这种二进制数表示的、计算机能够直接识别和执行的机器指令集合。

例如,下列是将17和20相加的机器指令(采用Intel 8086机器语言,Intel Pentium机器语言的子集):

1011000000010001
0000010000010100
101000100100100000000000

第一行告诉计算机将17复制到AL寄存器:前4位二进制数(1011)告诉计算机将信息复制到寄存器中,接下来的4位二进制数(0000)告诉计算机使用名为AL的寄存器,最后8位二进制数(00010001,表示整数17)为要复制的数。

用机器语言编写程序非常困难,也很难被人们阅读和理解,但在20世纪40年代,第一台计算机的程序员必须这样做,他们通过纸上打孔表示0和1来编写机器语言的程序,因为没有其他选择!

5.汇编语言(assembly language)

为了简化编程过程,人们引入了汇编语言。每条汇编指令对应一条机器语言指令,使人们更容易理解,如上述的机器语言用8086汇编语言中等效的加法程序可写为:

MOV AL, 17D
ADD AL, 20D
MOV [SUM], AL

用汇编语言编写的程序不能直接被计算机理解,因此需要翻译步骤。一种叫作“汇编程序”的程序可以将汇编语言编写的程序转化为机器语言程序。

6.高级语言(High-level language)

虽然汇编语言对机器语言有很大的改进,但它仍然很神秘,而且它的级别太低,和机器语言一样,即便是完成最简单的任务也需要很多条指令。于是,人们发明了高级语言,使编程变得更加容易。

在高级语言中,一条指令可以对应多条机器语言指令,高级语言采用类人类的语言表示指令,这使得程序更易于读取和写入。以下是上述代码的Python等效代码:

sum=17 + 20

1.1.3 编译器、解释器和Python语言

用高级语言编写的程序,在计算机执行之前也必须翻译为机器语言。某些编程语言的程序首先被整体翻译为机器语言的程序,并存储在指定文件中,然后再执行,这种语言称为编译型语言。也某些语言的程序语句被逐行翻译后再逐行执行,这种语言被称为解释型语言。Python就是解释型语言。

编译型语言通过一个编译器程序,将编译型语言编写的源文件编译为可执行的二进制程序文件。解释型语言通过一个解释器程序,对解释型语言编写的源文件的每一条语句逐条解释并执行。

编译器:编译器是将整个源代码程序一次性全部转换为机器语言代码的工具。转化后的机器语言代码可以直接在计算机上运行。

解释器:是“一行一行”地解释执行,即将每条语句翻译成解释器自己的中间代码,然后再由解释器执行这个中间代码。每条语句是在解释器自己的虚拟环境中执行的。

解释器对每条语句逐条转换执行,使初学者很容易知道程序的错误位置。而编译器对整个源程序进行一次性的转换,其优点是可以对代码进行整体的优化,从而提高程序的性能。

要求运行速度高或需要直接操纵硬件的程序通常使用C或C++语言编写。C或C++语言是编译型语言,编译器将C或C++语言程序编译为机器指令时,会对程序做很多细粒度的控制和优化,从而可以提高程序的运行速度,但编译需要耗费时间并且容易出错,而且需要整个程序写完且编译好后才能开始执行程序,而Python作为一种解释型语言,每条语句被逐条解释执行,可以立即发现程序错误,并可以看到程序运行结果,因此学习和编写这种解释型语言更容易。

1.1.4 Python程序开发步骤

利用Python编写程序要经历以下几个步骤。

(1)理解问题:如这是一个什么样的问题?输入数据是什么?要产生什么结果?

(2)提出算法:解决这个问题的指令(步骤)序列。

(3)编写程序:将算法转换成某种编程语言的程序。

(4)测试:输入各种可能的不同的数据,检测是否产生预期的结果。

例如,要计算一组数值的平均值,可以按照上述步骤进行。

(1)理解问题:这些数值从哪里输入(键盘还是文件)?结果如何显示(屏幕打印输出还是保存到文件)?

(2)提出算法:首先用两个数值分别表示总和(sum)及数值的个数(计数器,count),然后将输入的数值累加到总和上,同时累计数值的个数,最后用总和除数值的个数,得到平均值。人们经常以一种“伪代码”的方式描述算法的过程:

-----------start-------------
总和sum=0。
计数器为count=0。
重复:
    读一个值,
    如果读取值失败,结束这个“重复”过程,
    否则:
      将读取的值value加到sum。
      计数器增加1。

通过“总和”及“计算器”相除得到平均值。
显示/打印平均值。
-----------end------------

(3)编写程序:将算法用Python语言表示出来。

(4)测试:输入不同的测试数据,查看结果是否正确。输入的数据可以包含非法数据,查看程序能否适当地应对。例如,输入的数据是字符串而不是数值,程序是否会提示等。