第八章 程序设计方法论
人生苦短,请用Python。
Life is short. You need Python.
学习目标
- 了解计算思维的概念;
- 掌握自顶向下的设计方法;
- 掌握自底向上的执行过程;
- 了解计算生态和模块编程思想;
- 掌握Python 第三方库的安装方法;
- 掌握Python 源文件的打包方法。
计算思维
- 计算思维是人类科学思维活动的重要组成部分。人类在认识世界、改造世界过程中表现出三种基本的思维特征:
- 以实验和验证为特征的实证思维,以物理学科为代表;
- 以推理和演绎为特征的逻辑思维,以数学学科为代表;
- 以设计和构造为特征的计算思维,以计算机学科为代表。
- 计算思维是计算机科学发展到一定程度而提出的,它是人类逐渐意识到计算机解决问题的强大能力后而自然产生的思维模式,具有显著的时代特性。
- 程序设计是实践计算思维的重要手段
- 抽象实际问题的计算特性,利用计算机去求解
- 计算思维的本质 是抽象(Abstraction)和自动化(Automation)。
- 在程序设计范畴,计算思维主要反映在理解问题的计算特性、将计算特性抽象为计算问题、通过程序设计语言实现问题的自动求解等几个方面。
实例:体育竞技分析
这是一个模拟体育竞技并进行竞技分析的实例。
- 从各种球类比赛中抽象一般规则,规则定义如下:
- 两个球员在一个有四面边界的场地上用球拍击球。开始比赛时,其中一个球员首先发球。接下来球员交替击球,直到可以判定得分为止,这个过程称为回合。当一名球员未能进行一次合法击打时,回合结束。未能打中球的球员输掉这个回合。
- 如果输掉这个回合的是发球方,那么发球权交给另一方;如果输掉的是接球方,则仍然由这个回合的发球方继续发球。总之,每回合结束,由赢得该回合的一方发球。球员只能在他们自己的发球局中得分。首先达到15 分的球员赢得一局比赛。
- 在计算机模拟中,运动员的能力级别将通过发球方赢得本回合的概率来表示。因此,一个0.6 概率的球员可以在他的发球局有百分之六十的可能性赢得1 分。程序首先接收两个球员的水平值,然后通过利用这个值采用概率方法模拟多场比赛。程序最后会输出比赛运行结果。
- 该问题的IPO 模式如下:
- 输入:两个球员(球员A 和B)的能力概率,模拟比赛的场次;
- 处理:模拟比赛过程;
- 输出:球员A 和B 分别赢得球赛的概率
- 抽象这个问题时,将球员失误、犯规等可能性一并考虑在能力概率中,在每局比赛中,球员A 先发球。一个期望的输出结果如下
- 模拟比赛数量:500
- 球员A 获胜场次:268(53.6%)
- 球员B 获胜场次:232(46.4%)
将结合这个例子介绍自顶向下的设计方法和自底向上的执行方法。
自顶向下设计
程序需要采用自顶向下设计方法,采用自底向上的执行过程。
- 以一个总问题开始,试图把它表达为很多小问题组成的解决方案。再用同样的技术依次攻破每个小问题,最终问题变得非常小,以至于可以很容易解决。然后只需把所有的碎片组合起来,就可以得到一个程序
- 自顶向下设计中最重要的是顶层设计。
- 以体育竞技分析为例,可以从问题的IPO描述开始。大多数程序都可以简单将IPO 描述直接用到程序结构设计中,体育竞技分析从用户得到模拟参数模拟比赛,最后输出结果。
顶层设计
- 步骤1: 打印程序的介绍性信息;
- 步骤2:获得程序运行需要的参数:probA, probB, n;
- 步骤3:利用球员A 和B 的能力值probA 和probB,模拟n 次比赛;
- 步骤4:输出球员A 和B 获胜比赛的场次及概率。
结合体育竞技实例介绍了自顶向下的设计过程。从问题输入输出确定开始,整体设计逐渐向下进行。每一层以一个大体算法描述,然后逐步细化成代码,细节被函数封装
设计过程总结
- 步骤1:将算法表达为一系列小问题;
- 步骤2:为每个小问题设计接口;
- 步骤3:通过将算法表达为接口关联的多个小问题来细化算法;
- 步骤4:为每个小问题重复上述过程。
自底向上执行
- 开展测试的更好办法也是将程序分成小部分逐个测试
- 执行中等规模程序的最好方法是从结构图最底层开始,而不是从顶部开始,然后逐步上升。或者说,先运行和测试每一个基本函数,再测试由基础函数组成的整体函数,这样有助于定位错误
pyinstaller 库的使用
pyinstaller 是将Python 语言脚本(.py 文件)打包成Windows、Linux、Mac OS X 等操作系统下可执行文件的第三方库
PyInstaller是一个十分有用的第三方库,它能够在Windows、Linux、Mac OS X 等操作系统下将Python源文件打包,通过对源文件打包,Python程序可以在没有安装Python的环境中运行,也可以作为一个独立文件方便传递和管理。
PyInstaller 需要在命令行(控制台)下用pip 工具安装:
:\>pip install pyinstaller 或者
:\>pip3 install pyinstaller
PyInstaller 的官方网站网址为 http://www.pyinstaller.org/
PyInstaller库会自动将pyinstall 命令安装到Python 解释器目录中,与pip 或pip3命令路径相同,因此可以直接使用。
使用PyInstaller 库十分简单,在Windows 平台的命令行中输入Python 源文件名称,可以使用相对路径或绝对路径
:\>pyinstaller dpython.py
或
:\>pyinstaller D:\codes\dpython.py
执行完毕后,源文件所在目录将生成dist和build 两个文件夹。其中,build 目录是pyinstaller存储临时文件的目录,可以安全删除。最终的打包程序在dist内部的dpython目录中。目录中其他文件是可执行文件dpython.exe 的动态链接库
可以通过‐F 参数对Python 源文件生成一个独立的可执行文件,如下:
:\>pyinstaller -F dpython.py
执行后在dist 目录中出现了dpython.exe 文件,没有任何依赖库,执行它即可。
使用PyInstaller 库需要注意以下问题:
- 文件路径中不能出现空格和英文句号(.);
- 源文件必须是UTF‐8 编码,暂不支持其他编码类型。采用IDLE 编写的源文件都保存为UTF‐8 编码形式,可直接使用。
pyinstall 命令不需要在Python 源文件中增加代码,只需要通过命令行进行打包即可。‐F 参数最为常用,对于包含第三方库的源文件,可以使用‐p 添加第三方库所在路径。如果第三方库由pip 安装且在Python 环境目录中,则不需要使用‐p 参数。
#练习打包以前的练习程序
计算生态和模块编程
Python 语言有9万多个第三方库,形成了庞大的计算生态,模块编程思想是Python 语言最大的价值
Python的计算生态
- Python 语言从诞生之初致力于开源开放,建立了全球最大的编程计算生态。
- Python 官方网站提供了第三方库索引功能:https://pypi.python.org/pypi
- 该页面列出了Python 语言9 万多个第三方库的基本信息,这些函数库覆盖信息领域技术所有技术方向。这里需要说明,Python 语言的函数库并非都采用Python 语言编写。
胶水语言
由于Python 有非常简单灵活的编程方式,很多采用C、C++等语言编写的专业库可以经过简单的接口封装供Python 语言程序调用。这样的粘性功能使得Python 语言成为了各类编程语言之间的接口,俗称Python 语言为“胶水语言”。
第三方库
- Python第三方程序包括库(library)、模块(module)、类(class)和程序包(Package)等多种命名
- 统一将这些可重用代码统称为“库”。
- Python 内置的库称为标准库,其他库称为第三方库
- 在计算生态思想指导下,编写程序的起点不再是探究每个具体算法的逻辑功能和设计,而是尽可能利用第三方库进行代码复用,探究运用库的系统方法。
- 这种像搭积木一样的编程方式,称为“模块编程”
- 每个模块可能是标准库、第三方库、用户编写的其他程序或对程序运行有帮助的资源等。
Python 第三方库的安装
- 第三方库需要安装后才能使用。由于Python 语言经历了版本更迭过程,而且,第三方库由全球开发者分布式维护,缺少统一的集中管理,因此,Python的第三方库曾经一度制约了Python 语言的普及和发展。随着官方pip 工具的应用,Python 第三方库的安装变得十分容易。
- Python 第三方库依照安装方式灵活性和难易程度有三个方法,建议读者依次使用,能够将第三方库安装成功,
- 这三个方法是:pip 工具安装、自定义安装和文件安装。
pip 工具安装
- 最常用且最高效的Python第三方库安装方式是采用pip工具安装。
- pip是Python官方提供并维护的在线第三方库安装工具。
- 对于同时安装Python 2 和Python 3 环境的系统,建议采用pip3 命令专门为Python 3 版本安装第三方库。
- pip 是Python 内置命令,需要通过命令行执行,执行pip -h 命令将列出pip 常用的子命令,注意,不要在IDLE 环境下运行pip 程序。
- pip 支持安装(install)、下载(download)、卸载(uninstall)、列表(list)、查看(list)、查找(search)等一系列安装和维护子命令。
- 安装一个库的命令格式如下,例如:
pip install <拟安装库名>
- 例如,安装pygame 库,pip 工具默认从网络上下载pygame 库安装文件并自动安装到系统中。
pip install pygame
- 使用-U 标签可以更新已安装库的版本,例如,用pip 更新本身:
pip install -U pip
- 卸载一个库的命令格式如下,例如:
pip uninstall <拟卸载库名>
- 可以通过list 子命令列出当前系统中已经安装的第三方库,例如:
pip list
- pip 是Python 第三方库最主要的安装方式,可以安装超过90%以上的第三方库。然而,由于一些历史、技术和政策等原因,还有一些第三方库无法暂时用pip 安装,此时,需要其他的安装方法
自定义安装
文件安装
对于上述三种安装方式,一般优先选择采用pip 工具安装,如果安装失败,则选择自定义安装或者文件安装(Windows 平台)。另外,如果需要在没有网络条件下安装Python 第三方库,请直接采用文件安装方式。其中,.whl 文件可以通过pip download 指令在有网络条件的情况下获得。
实例:pip 安装脚本
这是一个用pip 安装第三方库的例子
pip 安装脚本
- 实例16共需要安装20个第三方Python 库
- 需要注意,库名是第三方库常用的名字,pip 安装用的名字和库名不一定完全相同,建议采用小写字符
- 安装过程请在系统命令行下进行,不在IDLE 中,部分库会依赖其他函数库,pip会自动安装,部分库下载后需要一个安装过程,pip 也会自动执行。成功安装库后会出现” Successfully installed…”提示
pip 批量安装Python 库
如果读者希望自动安装这些库,可以使用Python 标准库os 的system()函数调用控制台。
下面给出采用pip 批量安装Python 库的方法。
#批量安装Python库的程序