嵩天老师Python(8)程序设计方法学

实例:体育竞技分析

高手过招,胜负只在毫厘之间

“体育竞技分析”问题分析

体育竞技分析

  • 需求:毫厘是多少?如何科学分析体育竞技比赛?

  • 输入:球员的水平

  • 输出:可预测的比赛成绩

体育竞技分析:模拟N场比赛

  • 计算思维:抽象 + 自动化
  • 模拟:抽象比赛过程 + 自动化执行N场比赛
  • 当N越大时,比赛结果分析会越科学

比赛规则

  • 双人击球比赛:A & B,回合制,5局3胜
  • 开始时一方先发球,直至判分,接下来胜者发球
  • 球员只能在发球局得分,15分胜一局

自顶向下和自底向上

自顶向下(设计)——解决复杂问题的有效方法

  • 将一个总问题表达为若干个小问题组成的形式
  • 使用同样方法进一步分解小问题
  • 直至,小问题可以用计算机简单明了的解决

自底向上(执行)——逐步组建复杂系统的有效测试方法

代码实现

程序总体框架及步骤

  • 步骤1:打印程序的介绍性信息 - printInfo()
  • 步骤2:获得程序运行参数:proA, proB, n - getInputs()
  • 步骤3:利用球员A和B的能力值,模拟n局比赛 - simNGames()
  • 步骤4:输出球员A和B获胜比赛的场次及概率 - printSummary()

全代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from random import random

def printIntro():
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")

def getInputs():
a = eval(input("请输入选手A的能力值(0-1):"))
b = eval(input("请输入选手B的能力值(0-1):"))
n = eval(input("模拟比赛的场次:"))
return a, b, n

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))

def gameOver(a, b):
return a==15 or b==15

def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving ="A"
while not gameOver(scoreA,scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving = "B"
else:
if random() < probB:
scoreB += 1
else:
serving = "A"
return scoreA, scoreB

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

def main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)

main()

结果展示

举一反三

  1. 理解自顶向下和自底向上
  • 理解自顶向下的设计思维:分而治之
  • 理解自底向上的执行思维:模块化集成
  • 自顶向下是“系统”思维的简化
  1. 应用问题的扩展
  • 扩展比赛参数,增加对更多能力对比情况的判断
  • 扩展比赛设计,增加对真实比赛结果的预测
  • 扩展分析逻辑,反向推理,用胜率推算能力?

Python程序设计思维

计算思维

第3种人类思维特征

  • 逻辑思维:推理和演绎,数学为代表,A->B B->C A->C
  • 实证思维:实验和验证,物理为代表,引力波<-实验
  • 计算思维:设计和构造,计算机为代表,汉诺塔递归

计算思维(Computational Thinking):抽象问题的计算过程,利用计算机自动化求解,是基于计算机的思维方式。计算思维基于计算机强大的算力及海量数据,抽象计算过程,关注设计和构造,而非因果。

计算生态与Python语言

  • 以开源项目为代表的大量第三方库
  • 库的建设经过野蛮生长和自然选择
  • 库之间相互关联使用,依存发展
  • 社区庞大,新技术更迭迅速

计算生态的价值

  • 加速科技类应用创新的重要支撑
  • 发展科技产品商业价值的重要模式
  • 国家科技体系安全和稳固的基础

基本的程序设计模式

IPO
模块化设计
配置化设计

Python第三方库安装

Python社区:https://pypi.org

安装第三方库:

  1. 主要方法:使用pip命令
  2. 集成安装方法
  3. 文件安装方法

Anaconda: https://www.continuum.io

  • 支持近800个第三方库
  • 包含多个主流工具
  • 适合数据计算领域开发

UCI页面: http://www.lfd.uci.edu/~gohlke/pythonlibs/

  • 在UCI页面上搜索<库名称>
  • 下载对应版本的文件
  • 使用pip install <文件名>安装

os库的使用

os库基本介绍

os库提供通用的、基本的操作系统交互功能

  • os库是Python标准库,包含几百个函数
  • 常用路径操作、进程管理、环境参数等几类
    • 路径操作:os.path子库,处理文件路径及信息
    • 进程管理:启动系统中其他程序
    • 环境参数:获得系统软硬件信息等环境参数

os库的路径操作

os.path子库以path为入口,用于操作和处理文件路径
| 函数 | 描述 |
| ————————— | ——————————— |
| os.path.abspath(path) | 返回path在当前系统中的绝对路径 |
| os.path.normpath(path) | 归一化path的表示形式,统一用\\分隔路径 |
| os.path.relpath(path) | 返回当前程序与文件之间的相对路径(relative path)|
| os.path.dirname(path) | 返回path中的目录名称 |
| os.path.basename(path) | 返回path中最后的文件名称 |
| os.path.join(path,*paths) | 组合path与paths,返回一个路径字符串 |
| os.path.exists(path) | 判断path对应文件或目录是否存在,返回True或False |
| os.path.isfile(path) | 判断path所对应是否为已存在的文件,返回True或False|
| os.path.isdir(path) | 判断path所对应是否为已存在的目录,返回True或False |
| os.path.getatime(path) | 返回path对应文件或目录上一次的访问时间 |
| os.path.getmtime(path) | 返回path对应文件或目录最近一次的修改时间 |
| os.path.getctime(path) | 返回path对应文件或目录创建时间 |
| os.path.getsize(path) | 返回path对应文件的大小,以字节为单位 |

os库的进程管理

1
os.system(command)
  • 执行程序或命令command
  • 在Windows操作系统中,返回值为cmd调用的返回信息

os库的环境参数

获取或改变系统环境信息
| 函数 | 描述 |
| —————- | ———————————————– |
| os.chdir(path) | 修改当前程序的操作路径 |
| os.getcwd() | 返回程序的当前路径 |
| os.getlogin() | 获得当前系统登录用户名称 |
| os.cpu_count() | 获得当前系统CPU数量 |
| os.urandom(n) | 获得n个字节长度的随机字符串,通常用于加解密运算 |

实例:第三方库安装脚本

问题分析

  • 需求:批量安装第三方库需要人工干预,能否自动安装?
  • 自动执行pip逐一根据需求安装
库名 用途 pip安装指令
NumPy N维数据表示和运算 pip install numpy
Matplotlib 二维数据可视化 pip install matplotlib
PIL 图像处理 pip install pillow
Scikit-Learn 机器学习和数据挖掘 pip install sklearn
Requests HTTP协议访问及网络爬虫 pip install requests
Jieba 中文分词 pip install jieba
Beautiful Soup HTML和XML解析器 pip install beautifulsoup4
Wheel Python 第三方库文件打包工具 pip install wheel
PyInstaller 打包Python源文件为可执行文件 pip install pyinstall
Flask 轻量级Web开发框架 pip install flask
WeRoBot 微信机器人开发框架 pip install werobot
SymPy 数学符号计算工具 pip install sympy
Pandas 高效数据分析和计算 pip install pandas
Networkx 复杂网络和图结构的建模和分析 pip install networkx
PyQt5 基于Qt的专业级GUI开发框架 pip install pyqt5
PyOpenGL 多平台OpenGL开发接口 pip install pyopengl
PyPDF2 PDF文件内容提取及处理 pip install pypdf2
docopt Python命令行解析 pip install docopt
PyGame 简单小游戏开发框架 pip install pygame

实例解析

1
2
3
4
5
6
7
8
9
10
11
12
#BatchInstall.py
import os
libs = {"numpy","matplotlib","pillow","sklearn","requests",\
"jieba","beautifulsoup4","wheel","networkx","sympy",\
"pyinstaller","django","flask","werobot","pyqt5",\
"pandas","pyopengl","pypdf2","docopt","pygame"}
try:
for lib in libs:
os.system("pip install" + lib)
print("Successful")
except:
print("Failed Somehow")

举一反三

自动化脚本+

  • 编写各类自动化运行程序的脚本,调用已有程序
  • 扩展应用:安装更多第三方库,增加配置文件
  • 扩展异常检测:捕获更多异常类型,程序更稳定友好