本篇主要程序设计方法学,以体育竞技分析为例,介绍自顶向下的设计和自底向上的执行。以第三方库自动安装脚本为例,整体理解代码设计思路和os库的使用。
读完本篇,你将了解:
1.方法论
理解并掌握一批Python程序设计思维
2.实践能力
学会编写更有设计感的程序
本篇将系统介绍:
1.实例:体育竞技分析(了解自顶向下的设计和自底向上的执行)
2.Python程序设计思维(通过思维改变使编写程序上一个理论的高度)
3.Python第三方库安装(介绍广泛的Python计算生态的使用)
4.模块7: os库的基本使用(对讨算机的程序和文件进行相关的调用和操作)
5.实例14:第三方库自动安装脚本(os库的使用)
(1)体育竞技分析
①如何科学分析体育竞技比赛?
②输入:球员的水平
③输出:可预测的比赛成绩
(2)模拟N场比赛
①计算思维:抽象+自动化
②模拟︰抽象比赛过程+自动化执行N场比赛
③当N越大时,比赛结果分析会越科学(不同队员的能力差值在比赛结果的显示中就会变得很收敛)
④收敛性(稳定性)会给体育竞技带来可度量、可评价、可使用的结果
(3)设计比赛规则(球类通用)
①双人击球比赛:A&B,回合制,5局3胜
②开始时一方先发球,直至判分,接下来胜者发球
③球员只能在发球局得分,15分胜一局
(1)自顶向下(解决赋值问题的有效方法)
①将一个总问题表达为若干个小问题组成的形式
②使用同样方法进一步分解小问题
③直至,小问题可以用计算机简单明了的解决
(2)自底向上(执行)(逐步组建复杂系统的有效测试方法)
①分单元测试,逐步组装
②按照自顶向下相反的路径操作
③直至,系统各部分以组装的思路都经过测试和验证
(3)自顶向下的设计和自底向上的执行,是有效的通路组合
(1)第一阶段(自顶向下的分解):程序总体框架及步骤
①步骤1:打印程序的介绍性信息式(介绍信息会给用户带来更好的体验,并让用户知道这个程序的作用)
②步骤2∶获得程序运行参数:proA, proB, n(参数:运动员A和运动员B的能力值,模拟比赛的场次数量)
③步骤3∶利用球员A和B的能力值,模拟n局比赛
④步骤4∶输出球员A和B获胜比赛的场次及概率
⑤四个步骤分别对应四个函数
1)printInfo()打印介绍信息
2)getInputs()获得输入
3)simNGames()模拟比赛
4)printSummary()输出结果
(2)代码实现(相对模块化的分解)
①定义main函数(程序执行之后要执行的步骤)
def main( ) :
printIntro()
probA, probB,n = getInputs()
winsA,winsB = simNGames(n,probA, probB)
printSummary(winsA, winsB)
②printInfo()
def printIntro():
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
③getInputs()
def getInputs( ) :
a = eval(input("请输入选手A的能力值(0-1): "))
b = eval(input("请输入选手B的能力值(0-1): "))
n = eval(input("模拟比赛的场次:"))
return a, b,n
④printSummary()
def printSummary(winsA, winsB):
n = winsA + winsB
print("竞技分析开始,共模拟{}场比赛" .format(n))
print("选手A获胜{}场比赛,占比{:0.1%} ".format(winsA,winsA/n))
print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
(3)第二阶段:步骤3模拟N局比赛(相当于n次模拟一局比赛)
进行n次循环,执行simOneGame()
def simNGames(n, probA, probB):
winsA,winsB = 0, 0
for i in range(n):
scoreA,scoreB =simOneGame(probA,probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA,winsB
(4)至此,已分解为进行一场模拟比赛的问题(第三阶段)
def simOneGame(probA, probB):
scoreA, scoreB = 0,0
serving = "A" # 选手A开始发球
while not gameOver(scoreA, scoreB): # 只要当前比赛不结束,选手需进行操作
if serving == "A"
if random()<probA: # 生成随机变量,若在A能力范围内,A得一分
scoreA += 1 # 随机性表达A能力与A获得分数之间的关系
else:
serving="B" # 超越A能力范围,发球局换为B
else: # 对B同样
if random()<probB:
scoreB += 1
else:
serving="A"
return scoreA, scoreB # 返回分数
def gameOver(a,b):
return a==15 or b==15
①比较时,分数超过一个特定值就判断比赛结束
②gameOver:一局比赛结束的判断标准
③判断比赛结束成为一个独立小问题
(1)理解自顶向下和自底向上
①里解自顶向下的设计思维:分而治之
②理解自底向上的执行思维:模块化集成
③自顶向下是“系统"思维的简化
(2)应用能力扩展
①扩展比赛参数,增加对更多能力对比情况的判断
②扩展比赛设计,增加对真实比赛结果的预测
③扩展分析逻辑,反向推理,用胜率推算能力?
(1)三大思维(计算思维被认为是第三种人类思维特征)
①逻辑思维:推理和演绎,数学为代表,A->B,B->C,A->C
②实证思维:实验和验证,物理为代表,引力波<-实验
③计算思维:设计和构造,计算机为代表,汉诺塔递归
(2)计算思维的明显特征(抽象和自动化)
①计算思维:Computational Thinking
②抽象问题的计算过程(而非因果关系),利用计算机自动化求解
③计算思维是基于计算机的思维方式
(3)举例理解计算思维
①计数求和:计算1-100的计数和
1)逻辑思维:用首数加未数乘以项数除2
2)计算思维:
s = 0
for i in range(1,101):
s += i
2)计算思维:
用随机数功能,数量众多的撒点操作来计算
③汉诺塔问题
1)逻辑思维(数学推导):
2^n - 1次移动
2)计算思维:
模拟步骤,利用递归,获得最终数量
(4)庞大例子
①天气预报
1)实证思维(物理的、经验的东西来构造出未来的值)+逻辑思维(根据经验猜测温度)
2)如今的超级计算机(利用计算机演算:MM5模型),用布局在全球各个区域的传感器采集温度及气象变化数值,输入到计算机中
形成迭代和数据的演算
②量化分析(股市常用方法)
1)经验预测涨跌(过去规律演绎推理未来规律)
2)机器学习(历史数据预测未来可能的涨跌,利用计算机完成自动的交易)
(5)抽象问题的计算过程,利用计算机自动化求解
①计算思维基于计算机强大的算力及海量数据
②抽象计算过程,关注设计和构造,而非因果
③以计算机程序设计为实现的主要手段
④我们既需要设计和构造为特征的抽象问题的能力,也需要以编程为手段的自动化执行的方法(将思维变成结果)
(1)计算生态(从开源运动说起)
①1983,Richard Stallman启动GNU项目(希望开源的做出一套操作系统)
②989,GNU通用许可协议诞生,自由软件时代到来(软件通过免费的拷贝和使用来进行分发)
③1991,Linus Torvalds发布了Linux内核
④1998,网景浏览器开源,产生了Mozilla,开源生态逐步建立
(2)开源思想深入演化和发展,形成了计算生态
计算生态以开源项目为组织形式,充分利用“共识原则“和“社会利他"组织人员,在竞争发展、相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径。
(3)计算生态没有顶层设计、以功能为单位、具备三个特点
①竞争发展
②相互依存
③迅速更迭
(4)以Python语言为例
①以开源项目为代表的大量第三方库
Python语言提供>15万个第三方库
②库的建设经过野蛮生长和自然选择
同一个功能,Python语言提供2个或更多第三方库,相互竞争
③库之间相互关联使用,依存发展
Python库间广泛联系,逐级封装
④社区庞大,新技术更迭讯速
AlphaGo深度学习算法采用Python语言开源
(5)API(应用程序编写接口) !=生态
API是经过设计、发展的产物,不是野蛮生长的生态
(6)创新:跟随创新、集成创新、原始创新
①加速科技类应用创新的重要支撑
②发展科技产品商业价值的重要模式
③国家科技体系安全和稳固的基础
(7)计算生态的运用
①编程的起点不是算法而是系统
②编程如同搭积木,利用计算生态为主要模式
③编程的目标是快速解决问题
(1)用户体验(实现功能->关注体验)
①用户体验指用户对产品建立的主观感受和认识
②关心功能实现,更要关心用户体验,才能做出好产品
③编程只是手段,不是目的,程序最终为人类服务
(2)提高用户体验的方法
①方法1∶进度展示(如之前提到的文本进度条)
1)如果程序需要计算时间,可能产生等待,请增加进度展示
2)如果程序有若干步骤,需要提示用户,请增加进度展示
3)如果程序可能存在大量次数的循环,请增加进度展示
②方法2∶异常处理
1)当获得用户输入,对合规性需要检查,需要异常处理
2)当读写文件时,对结果进行判断,需要异常处理
3)当进行输入输出时,对运算结果进行判断,需要异常处理
③其他类方法
1)打印输出︰特定位置,输出程序运行的过程信息
2)日志文件:对程序异常及用户使用进行定期记录
3)帮助信息︰给用户多种方式提供帮助信息(如体育竞技信息实例)
(3)软件程序->软件产品
用户体验是程序到产品的关键环节
(1)从IPO(最基本的程序设计模式)开始
①I : Input 输入,程序的输入
②P : Process处理,程序的主要逻辑
③O : Output输出,程序的输出
(2)模式
①确定IPO:明确计算部分及功能边界
②编写程序:将计算求解的设计变成现实
③调试程序∶确保程序按照正确逻辑能够正确运行
(3)高级的程序设计方法(如自顶向下设计)
(4)模块化设计
①通过函数或对象封装将程序划分为模块及模块间的表达
②具体包括:主程序、子程序和子程序间关系
③分而治之:一种分而治之、分层抽象、体系化的设计思想
④紧耦合∶两个部分之间交流很多,无法独立存在
⑤松耦合︰两个部分之间交流较少,可以独立存在
⑥-模块内部紧耦合、模块之同松耦合
⑦配置化设计(自动轨迹绘制实例)(把程序中的数据和程序分离)
1)引擎+配置∶程序执行和配置分离,将可选参数配置化
2)将程序开发变成配置文件编写,扩展功能而不修改程序
3)关键在于接口设计,清晰明了、灵活可扩展
(5)应用开发的四个步骤(从应用需求到软件产品)
①产品定义∶对应用需求充分理解和明确定义(产品定义,而不仅是功能定义,要考虑商业模式)
②系统架构:以系统方式思考产品的技术实现(系统架构,关注数据流、模块化、体系架构)
③设计与实现:结合架构完成关键设计及系统实现(结合可扩展性、灵活性等进行设计优化)
④用户体验:从用户角度思考应用效果(用户至上,体验优先,以用户为中心)
(1)Python全球社区
①通过https://pypi.org/访问
②在此可访问任何第三方库
③PyPI : Python Package Index(Python包的索引)
④由PSF维护,展示全球Python计算生态的主站
⑤学会检索并利用PyPI,找到合适的第三方库开发程序
(2)实例:开发与区块链相关的程序
①第1步:在pypi.org搜索 blockchain
发现近百个相关库
②第2步∶挑选适合开发目标的第三方库作为基础
③第3步︰完成自己需要的功能
(3)安装Python第三方库
①方法1(主要方法):使用pip命令
②方法2:集成安装方法(安装一批第三方库)
③方法3:文件安装方法(安装一些特殊第三方库)
使用python自带的pip安装工具
(1)使用pip安装工具(命令行下执行)
①此工具可以在Windows平台,Mac OS平台和Linux平台使用
②打开命令行(每个操作系统提供的命令行,而不是IDLE之间的Python交互环境)
③输入pip-h:打出这个命令的帮助信息
(2)常用的pip命令
①D:>pip install <第三方库名>:安装指定的第三方库
②D:>pip install -U <第三方库名>:-U表示update,更新已安装的指定第三方库
③D:>pip uninstall <第三方库名> :卸载指定的第三方库
④D:>pip download <第三方库名>:下载但不安装指定的第三方库,可作为后续安装的基础
⑤D:>pip show <第三方库名>:列出某个指定第三方库的详细信息(介绍及使用方法等)
⑥D:>pip search <关键词>:根据关键词在名称和介绍中搜索第三方库
⑦D:>pip list:列出当前系统已经安装的第三方库
(3)pip安装方法(主要方法,适合99%以上情况)
①适合Windows、Mac和Linux等操作系统
②未来获取第三方库的官方给出的最主要也是唯一的方式,是目前的主要方式
③适合99%以上情况,需要联网安装(会受限于一定的当前的网络条件)
④若安装失败,根据错误提示信息(网络连接不好/其他原因)
(1)集成安装:结合特定的Python开发工具,批量安装一批库
(2)安装工具:Anaconda(https://www.continuum.io)
①Python数据处理方面的集成开发工具
②支持近800个第三方库
③包含多个主流工具
④适合数据计算领域开发
⑤只要把Anaconda相关程序下载并安装成,系统中就有了800个第三方库,可以使用他们而不需要安装
⑥这样的开发环境不止包括第三方库,还包含多种主流的Python开发工具
⑦目前是数据计算领域的相对标准的开发环境
(1)为什么有些第三方库用pip可以下载,但无法安装?
①某些第三方库pip下载后,需要编译再安装(提供的并不是可执行的文件,是第三方库的源代码)
②如果操作系统没有编译环境,则能下载但不能安装
③可以直接下载编译后的版本用于安装
(2)UCI页面(http://www.lfd.uci.edu/~gohlke/pythonlibs/)
①给出了在Windows操作系统上,一批可以下载但需经过编译再安装的第三方库的直接编译后的版本
②实例:安装wordcloud库
1)步骤1:在UCI页面上搜索wordcloud
2)步骤2∶下载对应版本的文件
3)步骤3∶使用pip install<文件名>安装
(1)优先使用pip命令
(2)用UCI页面打补丁
(3)只用Python语言进行数据分析,可以考虑使用Anaconda集成开发工具
(1)os库提供通用的、基本的操作系统交互功能
①os库是Python标准库,包含几百个处理函数
②处理与操作系统相关的包括常用路径操作、进程管理、环境参数等几类相关功能
(2)相关功能介绍
①路径操作:os.path子库,处理文件路径及获得信息
②进程管理:启动系统中其他程序
③环境参数:获得系统软硬件信息等环境参数
注:本节中只介绍与这三个功能相关的一些函数
(1)os.path子库以path为入口,用于操作和处理文件路径
①path:目录或包含文件名称的文件的路径
②调用方法
import os.path
import os.path as op
①normpath:仅将不同路径形式表示为统一形式
②relpath:知道相对路径,对后续程序改变目录,或者进行目录操作会带来很大的便利
③dirname&basename:很容易从路径中找到其目录及文件名称
④exists:此函数并未真正打开或读取这样的文件,只是去操作系统中去查找这个文件是否存在
⑤isfile&isdir:判断文件属性和类别
①a指的是access访问
②m指的是modify修改
③c指的是create创建
④返回时间对应的内部的数字值,可使用time库time.ctime函数,将这样的数值变成我们可读的年月日时分秒的形式
(1)os.system(command)
①执行程序或命令command
②在Windows系统中,返回值为cmd的调用返回信息
(2)举例:调用Windows下面的计算器程序
import os
os.system("c:\\windows\\System32\\calc.exe")
①只需要将计算器程序的文件路径作为参数放到os.system函数中
②之后计算器程序运行,同时本函数调用结束返回一个0,指的是程序正确运行
(3)可以给调用的程序赋予相关参数
①调用Windows系统中的mspaint(画图程序),并且指定一个文件给这个画图程序让它默认打开
②
import os
os.system("c:\\windows llsystem32\\mspaint.exe\ D:\\PYECourse\\grwordcloud.png")
③只需要使用画图程序mspaint.exe,同时在后面通过空格给出要打开的文件。作为参数给出system即可
④指定参数对os.system函数并不存在障碍。所有要执行的命令以字符串的形式当作参数输入即可
①chdir:例子中将当前的程序所关心的当前路径变为D盘根目录下
②在执行过os.chdir(D:)将程序运行的当前路径指定为D盘根目录下之后,我们可以使用os.getcwd获得当前路径
(1)第三方库自动安装脚本
①需求:批量安装第三方库需要人工干预,能否自动安装?
②自动执行pip逐一根据安装需求安装
③如何自动执行一个程序,例如:pip
代码实现
# BatchInstall.py
import os
libs = {
"numpy", "matplotlib", "pillow", "sklearn", "requests", \
"jieba", "beautifulsoup4", "wheel", "networkx", "sympy", \
"pyinstaller", "django", "f1ask", "werobot", "pyqt5", \
"pandas", "pyopengl", "pypdf2", "docopt", "pygame"}
# 建立集合,保留每一个库的名称
try: # 对安装的异常进行捕获
for lib in libs: # 逐一遍历集合的每个元素
os.system("pip install" + lib) # 调用指令:pip install +安装库名称
print("Successful") # 为增加用户体验,告知用户安装是否成功
except:
print("Failed Somehow")
自动化脚本+
①编写各类自动化运行程序的脚本,调用已有程序
②扩展应用:安装更多第三方库,增加配置文件
③扩展异常检测:捕获更多异常类型,程序更稳定友好
经过本篇的学习,可以大致掌握自顶向下和自底向上的程序设计思维。运用此方法去实现一些代码的构造部分实现。对于Python的第三方库,可以通过pip指令安装,或使用脚本,利用Python庞大的计算生态。
下篇将介绍拓展系列——Python计算生态概览。
本篇也是Python程序设计入门的最后一篇。
如有错误,欢迎指正!