Python 第1章 概述 程序设计语言是用于书写计算机程序的语言,是人指挥计算机工作的工具。20世纪 60年代以来,世界上公布的程序设计语言已有上千种,但是只有很小一部分得到了广泛 的应用。Python语言从20世纪90年代初诞生至今,已经成为最受欢迎的程序设计语言 之一。 本章介绍程序设计语言的基本概念、程序设计方法、程序运行过程、程序设计方法、 Python安装与开发环境、Python库、程序打包,最后介绍一个简单的实例。 1.1 程序设计语言 程序设计语言是人与计算机交流的语言。人类需要计算机完成的任务必须用某种程序 设计语言书写出来,形成程序,然后交给计算机去执行。程序设计语言经过多年的发展, 从机器语言、汇编语言,发展到了高级语言。 1.1.1 机器语言 在计算机发展的早期,使用的程序设计语言称为机器语言。因为计算机的内部电路 是由开关和其他电子器件组成的,这些器件只有两种状态,即开或关。一般情况下,“开” 状态用1表示,“关”状态用0表示,计算机所使用的是由0和1组成的二进制数,所以 二进制是计算机语言的基础。 为了能与计算机交流,指挥计算机工作,人们必须学会用计算机语言与计算机交流, 即要写出一串由0和1组成的二进制指令序列并交给计算机执行,这时所使用的语言就是 机器语言。 机器语言是面向机器的指令系统,计算机可以直接识别它,且不需要进行任何解释或 翻译。机器语言是严格与机器相关的,每台机器的指令格式和代码所代表的含义都是硬性 规定的,对不同型号的计算机来说,机器语言一般是不同的。由于使用的是针对特定型号 的计算机语言,因此机器语言的运算效率是所有语言中最高的。 Python 程序设计教程 2 尽管机器语言对计算机的工作是直接的、高效的,但是,能够使用机器语言的人还是 比较少的。使用机器语言的人必须懂得计算机工作的原理,这对于大部分非专业人士来说 是不可能的。 表1-1是一个机器语言程序,该程序的功能是实现两个整数相加。 表1-1 一个机器语言程序 机器语言指令 完成的操作 0001 0000 0010 0000 从内存单元20中取数,置于寄存器A中 0011 0000 0010 0001 寄存器A的数值加上内存单元21中的数值,和存入寄存器A中 0010 0000 0010 0010 把寄存器A的数值存入内存单元22中 0000 0000 0000 0000 结束程序运行 从以上程序可以看出,机器语言程序可读性差。另外,由于不同型号计算机的指令系 统不同,针对一种型号计算机书写的程序不能直接拿到另一种不同型号的计算机上运行, 因此程序可移植性差。 1.1.2 汇编语言 汇编语言也是一种面向机器的语言。为了帮助人们记忆,它采用了符号(称为助记 符)来代替机器语言的二进制码,所以又称为符号语言。 因为使用了助记符,所以用汇编语言书写的程序不能被计算机直接识别,需要一 种程序将汇编语言翻译成机器语言才能在计算机上执行,这种翻译程序称为汇编程序 (assembler)。把汇编语言程序翻译成机器语言程序的过程称为汇编。 表1-2所示是一个用汇编语言编写的程序,该程序的功能是实现两个整数相加。 表1-2 一个汇编语言程序 汇编语言指令 完成的操作 LOAD X 从内存单元X中取数,置于寄存器A中 ADD Y 寄存器A的数值加上内存单元Y的数值,和存入寄存器A中 STORE SUM 把寄存器A的数值存入内存单元SUM中 HALT 结束程序运行 汇编语言比机器语言易于读写、调试和修改,用汇编语言写的程序与机器语言程序 一样,具有执行效率高、占用内存少等特点,可以有效地访问、控制计算机的各种硬件 设备。 但汇编语言仍依赖于具体的处理器体系结构,用汇编语言编写的程序也不能直接在不 同类型处理器的计算机上运行,可移植性差。另外,要掌握好汇编语言也不容易,它要求 程序员熟悉各种助记符与硬件的关系,所以不被大多数非专业人士所接受。 第1章 概述 3 1.1.3 高级语言 尽管汇编语言极大提高了编程效率,但仍然需要程序员在所使用的计算机硬件上投入 大量的精力。另外,汇编语言也很枯燥,因为每条机器指令都需要单独编码。为了提高程 序员的效率,把程序员的注意力从关注计算机的硬件转移到解决实际应用问题上来,导致 了高级语言的产生与发展。 高级语言是面向用户的、基本上独立于计算机硬件结构的语言。其最大的优点是形式 与算术语言和自然语言接近,概念与人们通常使用的概念接近。高级语言的一个命令可以 代替几条、几十条,甚至几百条汇编语言指令。高级语言种类繁多,可以从应用角度和对 客观世界的描述两个方面对其进行分类。 1. 从应用角度分类 从应用角度来看,高级语言可以分为基础语言、结构化语言和专用语言。 (1)基础语言。基础语言也称为通用语言,其历史悠久,流传很广,有大量的已开 发的软件库,拥有众多的用户,为人们所熟悉和接受。属于这类语言的有FORTRAN、 COBOL、BASIC、ALGOL等。FORTRAN语言是国际上广为流行、也是使用得最早的一 种高级语言,从20世纪90年代起,在工程与科学计算中一直占有重要地位,且备受科技 人员的喜爱。BASIC语言是20世纪60年代初为适应分时系统而研制的一种交互式语言, 可用于一般的数值计算与事务处理,其结构简单、易学易用、具有交互能力,是许多初学 者学习程序设计的入门语言。 (2)结构化语言。20世纪70年代以来,结构化程序设计和软件工程的思想日益为人 们所接受,在其影响下,先后出现了一些很有影响的结构化语言。Pascal语言、C/C++语 言、Python语言就是它们中的突出代表。 Pascal语言是第一个系统地体现结构化程序设计概念的高级语言。由于它模块清晰、 控制结构完备、有丰富的数据类型和数据结构、语言表达能力强、可移植性好,而被国内 外许多高校用作教学语言。 C/C++语言具有功能丰富、表达能力强、运算符和数据类型丰富、使用灵活且方便、 应用面广、可移植性好、目标程序效率高等高级语言的特点,同时也具有低级语言的许多 特点,如允许直接访问物理地址、能进行位操作、能实现汇编语言的大部分功能、可直接 对硬件进行操作等。用C/C++语言编译程序产生的目标程序,其质量可以与汇编语言产 生的目标程序相媲美,让C/C++语言成为编写应用软件、操作系统和编译程序的重要语 言之一。 (3)专用语言。专用语言是为某种特殊应用而专门设计的语言。一般来说,这种语言 应用范围较窄,可移植性和可维护性不如结构化程序设计语言。随着时间的推移,业界已 出现了数百种专用语言,应用比较广泛的有APL语言、Forth语言、LISP语言等。 Python 程序设计教程 2. 从对客观世界的描述角度分类 从对客观世界的描述角度来看,程序设计语言可以分为面向过程语言和面向对象 语言。 (1)面向过程语言。以“数据结构+算法”程序设计范式构成的程序设计语言,称为 面向过程语言。前面所述Pascal语言、C语言是面向过程语言的典型代表。 (2)面向对象语言。以“对象+消息”程序设计范式构成的程序设计语言,称为面向 对象语言。比较流行的面向对象语言有Java、C++、Python等。 Java语言是一种面向对象的、不依赖于特定平台的程序设计语言,具有简单、可靠、 可编译、可扩展、多线程、动态存储管理、易于理解等特点,它是一种理想的用于开发网 络应用软件的程序设计语言。 C++语言是在C语言的基础上引入了面向对象的机制而形成的一门计算机编程语言。 C++继承了C语言的大部分特点:一方面,C++语言将C语言作为其子集,使其能与C 语言相兼容;另一方面,C++语言支持面向对象的程序设计。 1.1.4 Python语言 Python是一种面向对象的结构化编程语言,是由荷兰数学和计算机科学研究学会的吉 多·范罗苏姆(Guido van Rossum)于1990年代初设计的。1989年圣诞节期间,Guido为 了打发圣诞节的无趣,决心开发一个新的脚本程序。之所以选中Python(意为蟒蛇)作为 该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提·派森的飞行马戏 团》(Monty Python’s Flying Circus)。 Python逐渐发展为最受欢迎的程序设计语言之一。1995年,Guido在弗吉尼亚州的 国家创新研究公司继续他在Python上的工作,并在那里发布了该软件的多个版本;2000 年5月,Guido的核心开发团队转到BeOpen.com,并组建了BeOpen Python Labs团队; Python 2于2000年10月发布,稳定版本是Python 2.7;2001年,Python软件基金会 (PSF)成立,PSF是一个专为拥有Python相关知识产权而创建的非营利组织;2004年以 后,Python的使用率呈线性增长;Python 3于2008年12月发布,不完全兼容Python 2; 2011年1月,它被TIOBE编程语言排行榜评为2010年度语言;2018年3月,该语言作 者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持;2021年10月,被加冕为 最受欢迎的编程语言,20年来首次被置于Java、C和JavaScript之上。 Python语言是一种简单、易学、易读易维护、可扩展性好、可移植性好的程序设计 语言。Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就像是读英 语一样,使人能够专注于解决问题而不是去搞明白语言本身;因为Python有及其简单的 文档,所以极易上手;风格清晰统一、强制缩进,使得Python易读易维护;Python提供 了丰富的API和工具,程序员能够轻松地使用C语言、C++语言来编写扩充模块;由于 它的开源本质,Python已被移植到Linux、Windows、FreeBSD、macOS、Solaris、OS/2、 Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及 Android等平台上。 表1-3所示是一个用Python语言写的程序,该程序的功能是实现两个整数相加。 表1-3 一个Python程序 Python语句 完成的操作 x=3 被加数x,赋值3 y=4 加数y,赋值4 sum=x+y x加y的和数,存入sum 该程序可读性好,可移植性好。 1.2 程序设计方法 计算机程序的设计方法起源于日常解决问题的方法,流程图是描述问题解决思路的常 用工具之一。本节首先认识程序流程图,接着简要介绍两种常用的程序设计方法:结构化 程序设计方法和面向对象程序设计方法,最后介绍程序设计的步骤。 1.2.1 程序流程图 程序流程图又称为程序框图,它是用统一规定的标准符号描述程序运行具体步骤的图 形表示,流程图着重说明程序的逻辑性与处理顺序,描述计算机解题的逻辑及步骤。流程 图是进行程序设计的最基本依据。 流程图常用符号及含义如表1-4所示。 表1-4 流程图常用符号及含义 名 称 符 号 含 义 起、止框 表示程序的开始或结束,框内一般填写“开始”或“结束” 输入、输出框 表示程序的输入、输出,框内填写需要输入、输出的各项 处理框 表示程序中各种处理,框内填写的是用于处理的指令序列 判断框 表示程序中的条件判断,框内填写条件 连接点 当流程图在一个页面画不下时,常用它来表示相对应的连接处 流向线 表示程序的执行流程,箭头指向流程的方向 Python 程序设计教程 1.2.2 结构化程序设计方法 结构化程序设计(structured programming)方法又称为面向过程(procedure oriented) 的程序设计方法,它是20世纪70年代由知名的计算机科学家E.W.Dijkstra提出来的。该 方法指按照层次化、模块化的方法来设计程序,从而提高程序的可读性和可维护性。其主 要思想如下。 (1)程序模块化。程序模块化指把一个复杂的程序分解成若干个部分,每个部分称为 一个模块。它通常按功能划分模块,使每个模块实现相对独立的功能,使模块之间的联系 尽可能地简单。 (2)语句结构化。语句结构化指每个模块都用顺序结构、选择结构或循环结构来实现 流程控制。 顺序结构是指顺序执行的结构,即按照程序语句行的书写顺序,逐行执行程序。如 图 1-1所示,先执行语句A,再执行语句B,然后执行语句C。 选择结构又称为分支结构,根据条件成立与否决定执行哪个分支。如图 1-2所示,当 条件成立(真)时执行语句A,当条件不成立(假)时执行语句B,二者选一执行。 循环结构又称为重复结构,根据给定的条件,决定是否重复执行某段程序。循环结构 有两种:对先判断条件后执行语句(称为循环体)的称为当型循环结构,如图 1-3所示, 当条件成立(真)时执行循环体,条件不成立(假)时退出循环;对先执行循环体后判断 条件的称为直到型循环结构,如图 1-4所示,先执行一次循环体,然后判断条件,条件成 立(真)时继续执行循环体,条件不成立(假)时退出循环。 语句A 语句B 语句C 语句A语句B 条件假真 图1-1 顺序结构图 图1-2 选择结构图 语句 条件假 真 语句 条件 假 真 图1-3 当型循环结构图 图1-4 直到型循环结构图 (3)自顶向下、逐步求精的设计过程。自顶向下是指将复杂的、大的问题划分为小问 题,找出问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。逐步求精 是指将现实世界的问题经抽象转换为逻辑空间或求解空间的问题,复杂问题经抽象化处理 变为相对比较简单的问题,再经若干步抽象(精化)处理,直到求解域中只是比较简单的 编程问题,用3种基本程序结构即可实现。 (4)限制使用转向语句,如goto语句。因为滥用转向语句将使程序流程无规律,程 序可读性差。 结构化程序设计方法的有两个优点:第一,程序易于理解、使用和维护,即程序员采 用结构化编程方法,便于控制、降低程序的复杂性,因此容易编写程序,而且便于验证程 序的正确性,结构化程序清晰易读,可理解性好,程序员能够进行逐步求精、程序证明和 测试,以确保程序的正确性,程序容易阅读并被人理解,便于用户使用和维护;其二,提 高了编程工作的效率,降低了程序的开发成本。由于结构化编程方法能够把错误控制在最 低限度,因此能够减少调试和查错的时间。结构化程序是由一些为数不多的基本结构模块 组成,这些模块甚至可以由机器自动生成,从而极大地减轻了编程工作量。因此,结构化 程序设计方法得到了广泛应用。 支持结构化程序设计的程序设计语言有Pascal语言、C语言、Python语言等。 本书第1~5章主要介绍Python语言面向过程的程序设计方法。 1.2.3 面向对象程序设计方法 面向对象(object oriented)程序设计方法是一种支持模块化设计和软件重用的实际 可行的编程方法。它把程序设计的主要活动集中在建立对象和对象之间的联系上,从而 完成所需要的计算。一个面向对象的程序就是实现相互联系的对象集合。由于现实世界 可以抽象为对象和对象联系的集合,因此面向对象的程序设计方法更接近现实世界、更 自然。 面向对象程序设计中有几个基本概念:对象、消息、类、封装、继承和多态性。 (1)对象。对象是面向对象程序设计的基本要素。对象由一组属性和对这组属性进行 操作的一组方法构成。其中,属性描述对象的静态特征,如一个圆由圆心、半径等属性来 描述;方法描述对象的动态特征,如输入圆心、半径,输出圆心、半径等都是对圆对象的 属性进行操作。 (2)消息。通过向对象发送消息来处理对象。每个对象根据消息的性质来决定要采取 的行动,即响应一个消息。 (3)类。类是数据抽象和信息隐藏的工具,它是具有相同属性和方法的一组对象的抽 象描述。对象是类的实例。发送给一个对象的所有消息都在该对象的类中来定义,并以方 法来描述。 Python 程序设计教程 (4)封装。封装是一种组织软件的方法。它的基本思想是把客观世界中联系紧密的元 素及相关操作组织在一起,使其实现细节隐藏在内部,以简单的接口对外提供服务。 (5)继承。继承用于描述类之间的共同性质。它减少了相似类的重复说明,体现出 一般化及特殊化的原则。例如,可以把“汽车”作为一个一般化的类,而把“卡车”作为 一种更具体的类,它从汽车类继承了许多属性及方法,并且允许添加卡车类特有的属性和 方法。 (6)多态性。多态性指相同的语句组可以代表不同类型的实体或对不同类型的实体进 行操作。 用面向对象程序设计方法编写的程序,其结构与求解的实际问题的结构基本一致,具 有很好的可读性和可维护性。另外,利用继承、多态、模板等机制,程序设计者能够很好 地实现代码重用,极大地提高设计程序的效率。目前,面向对象程序设计方法已成为主流 的程序设计方法,在软件开发过程中被广泛使用。 支持面向对象的程序设计语言有C++语言、Java语言、Python语言等。 本书第6章介绍Python语言面向对象的程序设计方法。 1.2.4 程序设计的步骤 人们用程序设计语言书写程序的过程称为程序设计。程序设计过程包括分析、设计、 编码、测试和排错、编写文档等不同阶段。 1. 分析 分析指对于接受的任务进行认真分析,研究所给定的条件,分析最后应达到的目标, 找出解决问题的规律,选择解题的方法,完成实际问题。 2. 设计 设计指设计出解决问题的方法和具体步骤,这些方法和步骤统称为算法。 3. 编码 编码指将算法翻译成用计算机语言表示的程序。用高级语言编写的程序称为源程序。 源程序是文本文件,便于人们阅读和修改。计算机不能直接识别源程序,必须将源程序翻 译成机器语言表示的可执行程序,才能在计算机上运行。翻译的方式有两种:一种称为解 释方式,另一种称为编译方式。每一种高级语言都配有解释器或编译器,用于完成对源程 序的解释或编译。 解释方式是由解释器对源程序逐语句进行语法检查,一边解释,一边执行。如图 1-5 所示,解释结束,程序的运行结束。 编译方式是由编译器对源程序文件进行语法检查,并将之翻译为机器语言表示的二进 制程序,即目标程序。程序的编译和执行如图 1-6所示。 图 1-5和图 1-6中编辑需要用到文本编辑器,以实现源代码的输入、修改及存盘等操 作,形成源程序文件。不同的高级语言源程序文件,其文件扩展名不同。例如,C语言源 程序文件的扩展名为.c,C++源程序文件的扩展名为.cpp,Python源程序文件的扩展名 为.py等。 编辑 出错 True 开始 源程序 解释 执行 下一条 结束 TrueFalseFalse 编辑 出错 开始 源程序 编译 目标程序 出错 结束 TrueFalseFalse 连接 出错 可执行程序 运行 False 图1-5 程序的解释和执行 图1-6 程序的编译和执行 连接用到程序设计语言的连接器。连接器将编译得到的目标程序与系统提供的库文件 代码结合生成可执行程序。 解释方式和编译方式的主要区别包括以下三点。 (1)编译方式是一次性地完成翻译,一旦成功生成可执行程序,则不再需要源代码和 编译器即可执行程序;解释方式在每次运行程序时都需要源代码和解释器。 (2)解释方式执行需要源代码,所以程序纠错和维护十分方便;另外,只要有解释器 负责解释,源代码可以在任何操作系统上执行,可移植性好。 (3)编译所产生的可执行程序执行速度比解释方式的执行速度更快。 4. 测试和排错 测试和排错,即运行程序、分析结果。运行程序,能得到结果并不意味着程序正确, Python 程序设计教程 要对结果进行分析,看它是否合理。不合理时,要对程序进行调试,即发现和排除程序中 的故障,直至结果正确。 5. 编写文档 程序是提供给别人使用的。如同正式的产品应当提供产品说明书一样,正式提供给用 户使用的程序必须向用户提供程序说明书,内容应包括程序名称、程序功能、运行环境、 程序的装入和启动、需要输入的数据,以及使用注意事项等。 1.3 程序的运行过程 计算机程序是由计算机运行的,现代计算机是基于冯·诺依曼体系结构的,如图 1-7 所示。计算机由主机和外设组成,其中主机包含运算器、控制器和内存储器,外设含输入 设备、输出设备和外存储器,各个部件之间通过总线(含控制总线、数据总线和地址总 线)来通信。 输入设备 存储器 外存储器输出设备 内存储器 外 设 主 机 运算器 CPU 控制器 控制总线 数据总线 地址总线 图1-7 冯·诺依曼体系结构 程序和程序要处理的数据通过输入设备输入内存储器(简称内存),程序的运行结果 由输出设备输出。CPU执行程序的过程如下。 以两个整数相加的程序为例,一台简单体系结构的计算机完成该工作至少需要4条指 令。这4条指令和两个输入的整数在程序开始执行之前存储在内存之中,如图 1-8所示, 程序执行后的结果也存放在内存中。 图 1-8中,R1、R2、R3是数据寄存器(data register),用于暂存运算器的运算数据;I是 指令寄存器(instruction register),用于暂存CPU即将执行的指令;PC是程序计数寄存器 (program counter register),用于指出下一条即将取出的指令所在的内存地址。程序开始执 行时,PC中存放的070表示第1条要执行的指令在内存地址为070的位置,里面存放的 指令为: Load 200 R1 运算器 控 制 总 线 CPU 控制器 地址总线 Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202 数据总线 R1R2R3I070 PC ··· ··· ··· 图1-8 执行前内存和寄存器中的内容 图 1-9示意了4条指令的执行顺序。 图 1-9(a)示意了第1条指令执行后,CPU内各寄存器的状态。指令寄存器中存放的 是所执行程序的第1条指令,数据寄存器R1中存放的是指令执行后的结果,即从内存地 址200处取出数据(+14)放入寄存器R1中,PC中存放的是下一条要执行的指令的地址 (071)。 图 1-9(b)示意了第2条指令执行后,CPU内各寄存器的状态。指令寄存器中存放 的是所执行程序的第2条指令(Load 201 R2),数据寄存器R2中存放的是第2条指令的 执行结果,即从内存地址201处取出数据(-10),存入寄存器R2中,PC中存放的是下 一条要执行的指令地址(072)。 图 1-9(c)示意了第3条指令执行后,CPU内各寄存器的状态。指令寄存器中存放的 是所执行程序的第3条指令(Add R1 R2 R3),数据寄存器R3中存放的是第3条指令的 执行结果,即将寄存器R1和R2中的数据由运算器进行加法运算,将运算结果(+4)存 入寄存器R3中,PC中存放的是下一条要执行的指令地址(073)。 图 1-9(d)示意了第4条指令执行后,CPU内各寄存器的状态。指令寄存器中存放 的是所执行程序的第4条指令(Store 202 R3),即将寄存器R3中的值(+4)写入内存地 址202所在的位置,PC中存放的是下一条要执行的指令地址(074),依此类推。 Python 程序设计教程 a.After first instructionb.After second instructionc.After third instructiond.After fourth instructionLoad 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 071 PC ··· ··· ··· +14Load 200 R1Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 072 PC ··· ··· ··· +14Load 201 R2-10Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 073 PC ··· ··· ··· +14Add R1 R2 R3-10+4Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 074 PC ··· ··· ··· +14Store 202 R3-10+4+4 (a)第1条指令执行之后 (b)第2条指令执行之后 a.After first instructionb.After second instructionc.After third instructiond.After fourth instructionLoad 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 071 PC ··· ··· ··· +14Load 200 R1Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 072 PC ··· ··· ··· +14Load 201 R2-10Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 073 PC ··· ··· ··· +14Add R1 R2 R3-10+4Load 200 R1Load 201 R2Add R1 R2 R3Store 202 R3+14-10070071072073200201202R1R2R3Ⅰ 074 PC ··· ··· ··· +14Store 202 R3-10+4+4 (c)第3条指令执行之后 (d)第4条指令执行之后 图1-9 4条指令的执行顺序 1.4 Python安装与开发环境 一个好的开发环境可以极大提高编程开发的效率,用Python开发应用程序也不例外。 要用Python语言编写程序,需要安装Python解释器。 1.4.1 Python的安装 Python是纯粹的自由软件、开源项目的优秀代表,其解释器的全部源代码都是开源 的。Python语言解释器是一个轻量级的小软件,支持交互式和批量式两种编程方式,可以 在Python语言主网站上下载,其安装文件容量为25~30MB。下面介绍Python的下载和 安装步骤。 打开网页https://www.python.org/down/oads/,进入图 1-10所示的下载界面。 图 1-10所示的Python官网上同时发行Python 2.x和Python 3.x两个系列的版本,两 个系列版本互不兼容,很多内置函数的实现和使用方式也不一样,Python 3.x对Python 2.x 的标准库进行了重新拆分和整合。Python 2.x的最新版本是2020年4月发布,之后停止更 新。Python 3.x的最近版本是Python 3.10.7/3.9.14/3.8.14/3.7.14。需要说明的是,同系列版 本中,高版本比低版本更加完善。 图1-10 Python下载界面 根据所用的操作系统,在图 1-10中选择对应的Python 3.x系列安装程序。在图 1-10 中单击Download Python 3.10.7按钮即可下载Python的稳定版本;随着Python语言的 发展,此页面处会有更新的稳定版本出现。本章内容以Windows操作系统版本Python 3.10.6为例进行安装和环境配置。如果在其他操作系统下,请打开图 1-10中下部的相应链 接进行选择。 找到所下载的文件python-3.10.6-amd64,如图 1-11所示,双击,即可启动Python解 释器的安装,然后出现图 1-12所示的安装程序引导过程启动界面,勾选Add Python 3.10 to PATH复选框,单击Install Now按钮,出现图 1-13所示的安装界面,安装结束后,出 现图 1-14所示的安装成功界面。 图1-11 下载的Python-3.10.6-amd64文件 图1-12 安装程序引导过程启动界面 图1-13 Python 3.10.6安装界面 Python 程序设计教程 图1-14 Python 3.10.6安装成功界面 Python安装包在系统中安装了一批与Python开发和运行相关的组件,其中最重要 的两个是Python命令行和Python集成开发环境(Integrated Development and Learning Environment,IDLE)。图 1-15示意了Windows“开始”菜单中Python 3.10所包含的组件。 图1-15 Python 3.10所包含的组件 1.4.2 Python程序运行方式 运行Python程序有交互式和文件式。 交互式是指Python解释器即时响应用户输入的每条代码。 文件式(也称为批量式)是指用户将Python程序写在一个或多个文件中,然后启动 Python解释器批量执行文件中的代码。 交互式一般用于调试少量代码,文件式是最常用的编程方式。 【例1.1】编写一个程序,运行输出“Hello China!”。 学习编程语言都是从编写运行最简单的Hello程序开始的,即程序运行时在屏幕上输 出“Hello world!”,本例中改为输出“Hello China!”。这个程序虽小,却是初学者接触编 程语言的第一步。使用Python语言编写的Hello程序如下: print("Hello China!") 1. 交互式启动和运行程序 交互式启动和运行程序的方法有以下两种。 第一种方法是以命令方式启动。单击图 1-15中的Python 3.10(64-bit),在所出现界面 的命令提示符>>>后输入例1.1中的程序代码,按Enter键后显示输出“Hello China!”, 如图 1-16所示。 图1-16 以命令方式启动交互式Python运行环境 第二种方法是通过调用安装的IDLE来启动Python运行环境。单击图 1-15中的 IDLE(Python 3.10 64-bit),启动IDLE的交互式Python运行环境,在该环境下运行Hello 程序的效果如图 1-17所示。 图1-17 通过IDLE启动交互式Python运行环境 2. 文件式启动和运行程序 文件式启动和运行程序也有以下两种方法。 第一种方法是用文本编辑器(如记事本等)按照Python语法格式编写代码,如 图 1-18所示,并保存为.py格式的文件(此处命名为“hello.py”),然后运行Windows操 作系统下的cmd.exe程序,在命令提示符后输入python hello.py,即可得到图 1-19的结果。 图1-18 用记事本创建hello.py文件 图1-19 以命令方式运行Python程序文件 第二种方法是打开IDLE,在菜单栏中选择File→New File命令,在显示的窗口中输 入代码,并保存为hello.py,如图 1-20所示,然后选择Run→Run Module命令运行程序, 得到图 1-21所示的结果。 图1-20 以IDLE方式创建Python程序文件 图1-21 以IDLE方式运行Python程序文件 Python 程序设计教程 1.4.3 Python开发环境 “工欲善其事,必先利其器。”在开始学习使用Python之前,选择一个合适的集成开 发环境,有利于快速上手Python,以期在学习中起到事半功倍的效果。下面介绍常用的 Python IDE工具。 1. IDE的总体分类 IDE总体可以分为文本工具类和集成工具类。 文本工具类IDE包括IDLE、Sublime Text、Notepad++、Vim&Emacs、Atom、Komodo Edit等。 集成工具类IDE包括PyCharm、Anaconda&Spyder、Wing、PyDev&Eclipse、Visual Studio Code、Canopy等。 另外,还可以把所有的IDE分类为通用型IDE和专注于数据分析的IDE。 2. 通用类型的Python IDE (1)IDLE。如1.4.2节所述,IDLE是Python自带的、默认的、入门级编程工具,适 用于Python入门学习,功能简洁、直观,适合代码量在300行以内的程序。 (2)Sublime Text。Sublime Text是专门为程序员开发的第三方专用编程工具,它支持 代码高亮、自动补齐、多种颜色搭配等多种编程风格。Sublime Text包含收费版本和免费 版本,两者功能相同。不注册使用的就是免费版本。 (3)Wing。Wing是非常专业的Python集成工具类IDE。它是由商业公司维护的收费 工具,提供了丰富的调试功能,也提供了版本控制和版本同步,适合多人共同开发,适合 用于编写数千行至上万行的程序。 (4)Visual Studio Code。Visual Studio Code是在Windows、macOS和Linux上运行的 独立源代码编辑器。它是JavaScript和Web开发人员的理想选择,几乎可支持任何编程语 言的扩展,如适用于Visual Studio Code的Python扩展,并提供了视觉提示和工具,可让 用户更好、更快地编写Python代码。 (5)Eclipse。Eclipse是早年为Java程序员开发的开源IDE。用户可以通过PyDev在 Eclipse里配置Python的开发环境。用Eclipse配置Python开发环境,很多地方需要用户 自己来定义,相对比较复杂,用户需要具备较好的专业经验才能配置好Python IDE。 (6)PyCharm。PyCharm是一款专门面向Python的全功能集成开发环境。PyCharm 与Sublime Text一样,分为社区(免费)版和收费版。绝大多数程序用社区的免费版就可 以完成。 PyCharm是所有的集成类工具中相对简单且集成度较高的,且使用人数最多,适合编 写较大、较复杂的程序。 3. 科学计算与数据分析领域Python IDE (1)Canopy。Canopy是由商业公司提供和维护的第三方工具。该工具是收费的,且 价格较贵。Canopy支持500多个第三方库,是科学计算领域中集成度较高且使用方便的 IDE。 (2)Anaconda。Anaconda是一款第三方、开源、免费的工具,支持800多个第三方 库,包含多个主流的Python开发调试环境,十分适合在数据处理和科学计算领域使用。由 于Anaconda是一款跨平台工具,因此它可以很好地在Windows、Linux和macOS上使用。 ①Anaconda的来源。Anaconda和Canopy都是由Travis Oliphant开发和领导设计的。 Travis Oliphant也是SciPy、NumPy和Numba的创造者,Anaconda公司的创始人和董事, NumFOCUS公司的创始人,以及Quansight公司的CEO。2008年,Travis Oliphant领导开 发了Canopy工具。但是Travis Oliphant的开源开放理念与公司坚持Canopy收费的理念不 同,因此在2012年,Travis离开了原公司,带领新的团队开发了免费开源的Anaconda平 台。由于Anaconda是开源免费的,因此获得了来自全球的优秀工程师共同改进,并将平 台打造得非常好用。 ②Anaconda的本质。Anaconda是一个集成各类Python工具的集成平台,将很多第 三方的开发调试环境集成到一起。也就是说,Anaconda是一个集合,包括conda、某版本 Python、一批第三方库。 ③Anaconda中的conda。conda是一款开源的包管理系统和环境管理系统,可运行在 Windows、Linux和macOS上,还可快速安装、运行和更新包及其依赖项,也可轻松地在 计算机上创建、保存、加载和切换环境。它是为Python程序而创造的,但它可以打包和 分发任何语言的软件。 ④Anaconda中的Spyder。Spyder是一款编写和调试Python语言程序非常优秀的第三 方工具,由“Python之父”吉多·范罗苏姆参与开发而成。Sypder的优点是启动速度较 快、功能简单、容易上手。与MATLAB一样,Sypder对数据分析者非常有用,可满足数 据处理和科学计算方面的各种需求。 ⑤Anaconda中的IPython。IPython是一个能调用Python解释器的交互式编程环境, 它是一个功能更强的交互式Shell,能够显示很多的图形图像,适合进行交互式的数据可 视化以及与GUI相关的应用。IPython是一个前台的显示脚本,核心的功能是用作后台的 Python解释器。 本书所有代码均使用Python自带的IDLE调试通过。 1.4.4 Python文件名 文件的扩展名表示了文件的类型。在Python中,不同扩展名的文件也表示了不同的 文件类型。常见的扩展名及其含义如下。 .py:是Python源文件的扩展名,该文件由Python解释器负责解释执行。 .pyw:是Python源文件的扩展名,常用于图形界面程序文件。 Python 程序设计教程 .pyc:是Python字节码文件的扩展名,用户不能用文本编辑器查看该类型文件的 内容。 .pyo:是优化后的Python字节码文件的扩展名。从Python 3.5开始不再支持该类型的 文件。 .pyd:一般是由其他语言编写并编译的二进制文件的扩展名,常用于实现某些软件工 具的Python编程接口插件或Python的动态链接库。 1.5 Python库 Python库(又称为模块module)是一个包含若干函数定义、类定义或者常量的 Python源程序文件。这里的模块与儿童玩的积木模块类似,通过各种形状积木模块的拼 接,可以轻易搭出各种造型或实物模型。程序员通过Python模块的调用,可以较快地完 成某些问题的程序设计。通过调用模块进行编程的方法称为“模块编程”,它是Python 语言的重要特点之一。Python库分为内置函数、标准模块和扩展模块(又称第三方库)。 内置函数是由Python解释器提供的,这些函数不需要导入任何模块即可直接使用。内 置函数将在本书后续章节陆续介绍。本节主要介绍标准模块的概念和第三方库的概念与 管理。 1.5.1 标准模块 标准模块在安装Python时被一起安装。一般需要使用import指令导入模块,才能使 用对应模块中的函数。下面列出了Python中部分常见的标准模块。 math模块:是数学计算的标准函数库,支持整数和浮点数运算。 random模块:是生成随机数的函数库,主要用于生成随机数。 date、time模块:是显示日期和时间的标准函数库,用于从系统中获取时间,以用户 选择的格式输出。 turtle库:图形绘制函数库。 os模块:用于提供系统级别的操作,如对文件和目录进行操作。 sys模块:用于提供对解释器相关的操作。 json模块:用于处理JSON字符串。 logging:用于便捷记录日志且线程安全的模块。 hashlib模块:用于加密相关操作,代替了md5模块,主要是提供SHA1、SHA224、 SHA256、SHA384、SHA512和MD5算法。 1.5.2 第三方库 强大的标准库奠定了Python发展的基石,丰富和不断扩展的第三方库是Python壮大 的保证。进入PyPI官网可以看到发布的第三方库已达十多万种,众多的开发者为Python 贡献了自己的力量。下面列出了一些常用的第三方库。 openpyxl:用于读写Excel文件。 pymssql:用于操作Microsoft SQL Server数据库。 NumPy:用于数组计算与矩阵计算。 SciPy:用于科学计算。 Pandas:用于数据分析。 Matplotlib:用于数据可视化或科学计算可视化。 Scrapy:提供爬虫框架。 sklearn:用于机器学习。 TensorFlow:用于深度学习。 在默认情况下,安装Python时不会安装任何扩展库或第三方库,这些库需要单独安 装。一般需要使用import指令导入模块,才能使用对应模块中的函数。Python自带的pip 工具是管理扩展库的主要方式,支持Python扩展库的安装、升级和卸载等操作。 1. 在线安装指定模块 命令格式:pip install Package[= =version] 使用说明:可以使用方括号内的格式指定扩展库版本。 例如,在线安装Matplotlib扩展包。操作命令和运行过程如图 1-22所示。 图1-22 在线安装Matplotlib扩展包 2. 列出已安装模块及其版本号 图1-23 列出已安装模块及其版本号 命令格式:pip freeze[> filename.txt] 使用说明:我们可以使用重定向符>把扩展库信 息保存到文件filename.txt中。 例如,用pip freeze列出已安装模块及其版本号。 操作命令和运行结果如图 1-23所示。 3. 下载第三方库的安装包 命令格式:pip download Package 例如,用pip下载第三方库Pandas的安装包并验证下载成功。操作命令和运行结果如 图 1-24和图 1-25所示。 Python 程序设计教程 图1-24 下载第三方库Pandas 图1-25 显示下载的第三方库Pandas 4. 离线安装指定模块 命令格式:pip install Package.whl 对于大部分扩展库,使用pip工具直接在线安装都会成功。但是,有时会因为缺少 VC编辑器或依赖文件而失败。在Windows平台上,如果在线安装扩展库失败,此时可以 按上述方法下载扩展库编译好的WHL文件,然后在命令提示符环境中使用pip命令进行 离线安装。 例如,离线安装上文中下载的Pandas库。操作命令和运行结果如图 1-26所示。 图1-26 离线安装第三方库Pandas 5. 升级指定模块 命令格式:pip install --upgrade Package 例如,升级Pandas库。操作命令和运行结果如图 1-27所示。 图1-27 升级第三方库 6. 卸载指定模块 命令格式:pip uninstall Package [==version] 例如,卸载Pandas库。操作命令和运行结果如图 1-28所示。 图1-28 卸载Pandas库 7. 帮助信息 命令格式:pip -h 通过pip -h可以列出pip命令的用法和所有选项的功能。图 1-29显示了操作命令和运 行结果。 图1-29 显示帮助信息 Python 程序设计教程 1.6 程序打包 前面介绍的Python程序运行方式即交互式运行方式和文件批量式运行方式都离不开 Python编程环境。实际中,用户只对应用程序的使用感兴趣,这时,在没有安装编程环境 的计算机上运行Python程序就变得十分重要。 一种解决办法就是把Python程序转换为二进制可执行程序(EXE文件),这个过程 称为打包。打包之后再发布的程序可以在没有安装Python环境和相应扩展库的系统中运 行,从而极大地方便了用户。 程序打包需要专门的打包工具或软件。常用的打包工具有:py2exe(仅适用于 Windows平台)、PyInstaller、cx_Freeze等。 以PyInstaller为例,先使用pip安装,如图 1-30所示。安装好后,在命令提示符环境 中使用的命令格式如下。 pyinstaller 选项 Python 源文件 例如,将前述hello.py文件打包的命令为:pyinstaller hello.py,该命令可将hello.py及 其所依赖的包打包成当前所用操作系统平台上的可执行文件,如图 1-31所示。 图 1-31中显示出了执行命令时的详细生成过程。当生成完成后,将会在图 1-31中的 example1目录下生成一个dist目录,并在该目录下生成一个名称为hello的文件夹,在该 文件夹下有hello.exe文件,如图 1-32所示,该文件就是PyInstaller工具生成的EXE程 序。执行hello.exe,将会看到输出结果:Hello China!。 图1-30 用pip安装PyInstaller 图1-31 用PyInstaller打包hello.py程序 图1-32 PyInstaller生成的可执行文件 PyInstaller工具是跨平台的,它既可以在Windows平台上使用,也可以在macOS平 台上运行。在不同的平台上使用PyInstaller工具的方法是相似的。 其他打包工具的使用方法在此不再赘述。在需要的时候,请读者自行查阅相关文档 学习。 1.7 应用举例 本节通过一个应用实例,将本章前面所介绍的知识进行具体的运用。 Python 程序设计教程 【例1.2】编写程序,根据圆的半径,计算圆的周长和面积。 根据数学上所学知识,给出圆的半径radius,计算周长girth和面积area的公式分 别为: girth*π*radius=2 areaπ*radius*radius= 根据前述分析,可以设计出该问题的程序流程图,如图 1-33所示。 输入radius 开始 girth=2*π*radiusarea=π*radius*radius 输出girth和area的值 结束 图1-33 计算圆的周长和面积程序流程图 图 1-33中,程序从“开始”的位置出发,沿着箭头的流向执行,分别是:输入半径、 计算周长和面积、输出周长和面积,最后到“结束”的位置,表示程序结束。 大多数程序都可以按上述流程图所表示的步骤来进行设计,即:输入→计算→输出。 设计完成后,即可进入编码阶段。这一阶段可以借助1.4.2节结构化程序设计方法和 1.4.3节面向对象的程序设计方法,使用Python语言来编写。 使用面向过程的程序设计方法编写的源代码如下所示。 1 # 1_2.py2 import math3 4 radius = eval(input("请输入半径:")) 5 6 girth = 2 * math.pi * radius7 area = math.pi * radius *radius89 print(" 半径 = ", radius) 10 print(" 周长 = ", qirth) 11 print(" 面积 = ", area) 其中,第1行是注释,说明了源程序的文件名,Python源程序文件的扩展名是.py;第2 行导入math库,因为程序中要用到库里的常数pi(π);第4行由用户输入圆的半径;第 6行和第7行分别使用求圆的周长和面积的公式,计算圆的周长和面积;第9~11行, 输出半径、周长和面积。 使用面向对象的程序设计方法编写的Python源程序如下所示。 1 # 1.2_1.py2 import math34 class Circle: 5 def __init__(self,r): 6 self.__radius = r7 def eval_girth(self): 8 return 2 * math.pi * self.__radius9 def eval_area(self): 10 return math.pi * self.__radius * self.__radius1112 ra = eval(input("请输入圆的半径:")) 13 circle1 = Circle(ra) 14 print(" 周长 = ", circle1.eval_girth()) 15 print(" 面积 = ", circle1.eval_area()) 其中第4~10行是圆类定义,第4行的class是Python语言定义类的关键字,Circle是 类的名称,冒号(:)是类体的前导符号,类体各行通过行首的缩进与类形成包含关系, 类Circle封装了类的属性self.__radius和方法“__init__”“eval_girth”“eval_area”,第 12~13行定义了类Circle的对象circle1,第14~15行对象circle1通过调用其方法 eval_girth()和eval_area()来完成对对象的操作,即求计算圆的周长和面积。 Python程序通过缩进来体现代码之间的逻辑关系。除了以上的类定义外,第3章和 第4章将介绍选择结构、循环控制结构、异常处理、函数定义等,第1行末尾的冒号(:) 和接下来一行的缩进表示了一个代码块的开始,缩进结束则表示代码块结束。 在同一个程序中,要求各个级别的代码块缩进量必须相同。在IDLE开发环境中,一 般默认的缩进量是4个空格。 所编写的代码必须通过Python解释器解释。解释器一方面能检查源代码是否有语法 错误,另一方面对没有语法错误的代码解释为机器语言表示的二进制程序,以便计算机 执行。我们可以使用前面介绍的集成开发环境来完成代码编写、测试、排错。本章使用 Python自带的IDLE,分别建立面向过程的源程序文件1_2.py和面向对象的源程序文件 1.2_1.py,然后运行程序即可。程序运行时,当输入半径的值为1时,程序即可求出半径 为1的圆的周长和面积。下面是程序的运行结果。 Python 程序设计教程 >>> 请输入半径:1 半径 = 1 周长 = 6.283185307179586 面积 = 3.141592653589793 可见,半径为1的圆的周长为6.283185307179586,面积为3.141592653589793。 正式提供给用户使用的程序必须向用户提供程序说明书。本程序的说明书如表1-5所 示,内容应包括程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据, 以及使用注意事项。 表1-5 例1.2程序的说明书 程 序 名 称 1_2.py 程序功能 根据圆的半径求圆的周长和面积 运行环境 IDLE或其他Python解释器 程序的装入和启动 在IDLE下打开程序文件,然后按F5键;有关其他解释器的装入和启动方法, 请读者自行查阅对应解释器的帮助文档 需要输入的数据 圆半径的值 注意事项 半径大于或等于0才有意义 因为本书的示例大部分都是用于学习,为了突出重点,后面将主要介绍问题分析、设 计、编码、测试和排错等步骤,编写文档部分将弱化。 1.8 本章小结 程序设计语言是人与计算机交流的语言。程序设计语言从机器语言、汇编语言,发展 到了高级语言。Python是一种面向对象的高级程序设计语言。 流程图是进行程序设计的最基本依据。常用的程序设计方法有结构化程序设计方法和 面向对象程序设计方法。 程序设计过程包括分析、设计、编码、测试和排错、编写文档等不同阶段。 程序和程序要处理的数据通过输入设备输入内存,CPU从内存取指令、分析指令和执 行指令,所有指令都被执行完后得到程序的运行结果,程序的运行结果由输出设备输出。 要用Python语言编写程序,需要安装Python解释器。我们可以在Python语言官方网 站上下载Python解释器进行安装,也可以选用第三方集成开发环境,如PyCharm、Visual Studio Code等。 使用库或模块可以提高编程效率。Python自带的库称为内置函数,安装好Python后 即可使用。对于第三方提供的扩展库,我们可以使用Python的pip工具来对其进行下载安 装、升级、卸载等操作。 程序打包是指把Python程序转换为二进制可执行程序。程序打包需要专门的打包 工具或软件。常用的打包工具有py2exe(仅适用于Windows平台)、PyInstaller、cx_ Freeze等。 大多数应用程序按输入→计算→输出的步骤进行设计。 Python程序的代码块依靠缩进来体现各自的逻辑关系。 习题 1.编写程序,在屏幕上输出“中国,你好!”。 2.编写程序,在屏幕上输出下列图形。 3.编写程序,输入矩形的长和宽,求矩形的周长和面积。 第1章 补充习题