Python入门——(八)程序设计方法学

实例13: 体育竞技分析

"体育竞技分析"问题分析

问题分析

体育竞技分析

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

问题分析

体育竞技分析

  • 需求:毫厘是多少?如何科学分析体育竞技比赛?
  • 输入:球员的水平
  • 输出:可预测的比赛成绩

问题分析

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

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

问题分析

比赛规则

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

自顶向下和自底向上

自顶向下

解决复杂问题的有效方法

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

自顶向下(设计)

解决复杂问题的有效方法

改善

居住条件

组织  设计和施工

自底向上(执行)

逐步组建复杂系统的有效测试方法

  • 分单元测试,逐步组装
  • 按照自顶向下相反的路径操作
  • 直至,系统各部分以组装的思路都经过测试和验证

自底向上(执行)

逐步组建复杂系统的有效测试方法

改善

居住条件

单独测试  各开发模块

"体育竞技分析"实例讲解

体育竞技分析

程序总体框架及步骤

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

体育竞技分析

程序总体框架及步骤

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

体育竞技分析

第一阶段:程序总体框架及步骤

体育竞技分析

第一阶段

def main():

printIntro()

probA, probB, n = getInputs()

winsA, winsB = simNGames(n, probA, probB) printSummary(winsA, winsB)

体育竞技分析

第一阶段

体育竞技分析
介绍性内容,提高用户体验
print("程序运行需要AB的能力值(01之间的小数表示)")
print("这个程序模拟两个选手AB的某种竞技比赛")def printIntro():

第一阶段

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

体育竞技分析

第二阶段:步骤3 模拟N局比赛

simNGames()

proA proB

scoreA scoreB

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

根据分数判断局的结束

体育竞技分析

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 gameOver(a,b):

return a==15 or b==15

体育竞技分析


printInfo() getInputs()proA proB n

proA proB n

winsA winsB

winsA winsB

自顶向下

体育竞技分析

>>>

这个程序模拟两个选手AB的某种竞技比赛

程序运行需要AB的能值(01间的数表)请输入选手A的能(0-1): 0.45

请输入选手B的能力值(0-1): 0.50

模拟比赛的场次: 1000

竞技分析开始,共模拟1000赛选手A获胜365赛,36.5%选手B获胜635赛,63.5%

能力值:0.45 v.s. 0.50

获胜数:36.5% v.s. 63.5%
举一反三"体育竞技分析"举一反三

理解自顶向下和自底向上

  • 理解自顶向下的设计思维:分而治之
  • 理解自底向上的执行思维:模块化集成
  • 自顶向下是“系统”思维的简化

举一反三

应用问题的扩展

  • 扩展比赛参数,增加对更多能力对比情况的判断
  • 扩展分析逻辑,反向推理,用胜率推算能力?
  • 扩展比赛设计,增加对真实比赛结果的预测

 

Python程序设计思维

  • 计算思维与程序设计
  • 计算生态与Python语言
  • 用户体验与软件产品
  • 基本的程序设计模式

计算思维与程序设计

计算思维

第3种人类思维特征

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

计算思维

抽象和自动化

  • 计算思维:Computational Thinking
  • 抽象问题的计算过程,利用计算机自动化求解
  • 计算思维是基于计算机的思维方式

计算思维

计数求和:计算1-100的计数和

s = 0

for i in range(1, 101): s += i

逻辑思维

数学家高斯的玩儿法

计算思维

现代人的新玩儿法

计算思维

圆周率的计算

计算思维

汉诺塔问题

count = 0

def hanoi(n, src, dst, mid):

… ()

hanoi(3, "A", "C", "B")

print(count)

�n − � 计算思维

>>>

1:A->C

2:A->B

1:C->B

3:A->C

1:B->A

2:B->C

1:A->C

7

计算思维实证思维+逻辑思维 计算思维

量化分析

实证思维+逻辑思维 计算思维

计算思维

抽象问题的计算过程,利用计算机自动化求解

  • 计算思维基于计算机强大的算力及海量数据
  • 抽象计算过程,关注设计和构造,而非因果
  • 以计算机程序设计为实现的主要手段

计算思维与程序设计

编程是将计算思维变成现实的手段

计算思维 真的很有用…

计算生态计算生态与Python语言

从开源运动说起…

  • 1983, Richard Stallman启动GNU项目
  • 1989, GNU通用许可协议诞生

自由软件时代到来

计算生态

从开源运动说起…

  • 1991, Linus Torvalds发布了Linux内核
  • 1998, 网景浏览器开源,产生了Mozilla开源生态逐步建立

计算生态

大教堂模式 集市模式

计算生态

开源思想深入演化和发展,形成了计算生态

计算生以开源项目为组织形式充分利用“共识原则”和“社会利他组织人员在竞争发展、相互依存和迅速更中完成信息技术的更新换代,形成了技术的我演化路径。

计算生态

没有顶层设计、以功能为单位、具备三个特点

计算生态与Python语言

  • 以开源项目为代表的大量第三方库

Python语言提供 >13万个第三方库

  • 库的建设经过野蛮生长和自然选择

同一个功能,Python语言2个以上第三方库

计算生态与Python语言

  • 库之间相互关联使用,依存发展

Python库间广泛联系,逐级封装

  • 社区庞大,新技术更迭迅速

AlphaGo深度学习算法采用Python语言开源

计算生态与Python语言
创新:跟随创新、集成创新、原始创新计算生态的价值

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

计算生态的运用

刀耕火种 -> 站在巨人的肩膀上

  • 编程的起点不是算法而是系统
  • 编程如同搭积木,利用计算生态为主要模式
  • 编程的目标是快速解决问题

计算生态

优质的计算生态

用户体验与及软件产品

用户体验

实现功能 -> 关注体验

  • 用户体验指用户对产品建立的主观感受和认识
  • 关心功能实现,更要关心用户体验,才能做出好产品
  • 编程只是手段,不是目的,程序最终为人类服务

提高用户体验的方法

方法1:进度展示

  • 如果程序需要计算时间,可能产生等待,请增加进度展示
  • 如果程序有若干步骤,需要提示用户,请增加进度展示
  • 如果程序可能存在大量次数的循环,请增加进度展示

提高用户体验的方法

方法2:异常处理

  • 当获得用户输入,对合规性需要检查,需要异常处理
  • 当读写文件时,对结果进行判断,需要异常处理
  • 当进行输入输出时,对运算结果进行判断,需要异常处理

提高用户体验的方法

其他类方法

  • 打印输出:特定位置,输出程序运行的过程信息
  • 日志文件:对程序异常及用户使用进行定期记录
  • 帮助信息:给用户多种方式提供帮助信息

软件程序 -> 软件产品

用户体验是程序到产品的关键环节

基本的程序设计模式

从IPO开始…

  • I:Input 输入,程序的输入
  • O:Output 输出,程序的输出
  • P:Process 处理,程序的主要逻辑

基本的程序设计模式

从IPO开始…

  • 确定IPO:明确计算部分及功能边界
  • 编写程序:将计算求解的设计变成现实
  • 调试程序:确保程序按照正确逻辑能够正确运行

基本的程序设计模式

自顶向下设计

  • I:Input 输入,程序的输入
  • P:Process 处理,程序的主要逻辑
  • O:Output 输出,程序的输出

基本的程序设计模式

自顶向下设计

  • I:Input 输入,程序的输入
  • P:Process 处理,程序的主要逻辑
  • O:Output 输出,程序的输出

基本的程序设计模式

模块化设计

  • 通过函数或对象封装将程序划分为模块及模块间的表达
  • 具体包括:主程序、子程序和子程序间关系
  • 分而治之:一种分而治之、分层抽象、体系化的设计思想

基本的程序设计模式

模块化设计

  • 紧耦合:两个部分之间交流很多,无法独立存在
  • 松耦合:两个部分之间交流较少,可以独立存在
  • 模块内部紧耦合、模块之间松耦合

基本的程序设计模式

配置化设计

程序引擎 配置文件

基本的程序设计模式

配置化设计

  • 引擎+配置:程序执行和配置分离,将可选参数配置化
  • 将程序开发变成配置文件编写,扩展功能而不修改程序
  • 关键在于接口设计,清晰明了、灵活可扩展

应用开发的四个步骤

从应用需求到软件产品

  • 1 产品定义
  • 2 系统架构
  • 3 设计与实现
  • 4 用户体验

应用开发的四个步骤

从应用需求到软件产品

  • 1 产品定义:对应用需求充分理解和明确定义

产品定义,而不仅是功能定义,要考虑商业模式

  • 2 系统架构:以系统方式思考产品的技术实现

系统架构,关注数据流、模块化、体系架构

应用开发的四个步骤

从应用需求到软件产品

  • 3 设计与实现:结合架构完成关键设计及系统实现

结合可扩展性、灵活性等进行设计优化

  • 4 用户体验:从用户角度思考应用效果

用户至上,体验优先,以用户为中心

Python第三方库安装

  • 看见更大的Python世界
  • 第三方库的pip安装方法
  • 第三方库的集成安装方法
  • 第三方库的文件安装方法

看见更大的Python世界

 

>13万个第三方库 https://pypi.org/

PyPI

  • PyPI: Python Package Index
  • PSF维护的展示全球Python计算生态的主站
  • 学会检索并利用PyPI,找到合适的第三方库开发程序

实例:开发与区块链相关的程序

  • 1步:在pypi.org搜索 blockchain
  • 2步:挑选适合开发目标的第三方库作为基础
  • 3步:完成自己需要的功能

Python社区

实例:开发与区块链相关的程序

安装Python第三方库

三种方法

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

第三方库的pip安装方法

D:\>pip –h 使用pip安装工具(命令行下执行)

Usage:

pip <command> [options] Commands:

install Install packages.

download Download packages.

uninstall Uninstall packages.

freeze Output installed packages in requirements format.

list List installed packages.

show Show information about installed packages.

check Verify installed packages have compatible dependencies.

search Search PyPI for packages.

wheel Build wheels from your requirements.

help Show help for commands.

常用的pip命令

D:\>pip install <第三方库名>

- 安装指定的第三方库

pip安装方法

常用的pip命令

D:\>pip install –U <第三方库名>

- 使用-U标签更新已安装的指定第三方库

pip安装方法

常用的pip命令

D:\>pip uninstall <第三方库名>

- 卸载指定的第三方库

pip安装方法

常用的pip命令

D:\>pip download <第三方库名>

- 下载但不安装指定的第三方库

pip安装方法

常用的pip命令

D:\>pip show <第三方库名>

- 列出某个指定第三方库的详细信息

pip安装方法

常用的pip命令

D:\>pip search <关键词>

- 根据关键词在名称和介绍中搜索第三方库

 

pip search blockchain

常用的pip命令

D:\>pip list

- 列出当前系统已经安装的第三方库

pip安装方法

主要方法,适合99%以上情况

  • 适合WindowsMacLinux等操作系统
  • 未来获取第三方库的方式,目前的主要方式
  • 适合99%以上情况,需要联网安装

第三方库的集成安装方法

集成安装方法

集成安装:结合特定Python开发工具的批量安装 Anaconda

https://www.continuum.io

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

第三方库的文件安装方法

文件安装方法

为什么有些第三方库用pip可以下载,但无法安装?

  • 某些第三方库pip下载后,需要编译再安装
  • 如果操作系统没有编译环境,则能下载但不能安装
  • 可以直接下载编译后的版本用于安装吗?

http://www.lfd.uci.edu/~gohlke/pythonlibs/

UCI页面

实例:安装wordcloud

  • 步骤1:在UCI页面上搜索wordcloud
  • 步骤2:下载对应版本的文件
  • 步骤3:使用pip install <文件名>安装

Python第三方库安装

  • PyPIPython Package Index
  • pip命令的各种用法

 

 

模块7: os库的使用

os库基本介绍

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

  • os库是Python标准库,包含几百个函数
  • 常用路径操作、进程管理、环境参数等几类

os库基本介绍

  • 路径操作:os.path子库,处理文件路径及信息
  • 进程管理:启动系统中其他程序
  • 环境参数:获得系统软硬件信息等环境参数

路径操作

os.path子库以path为入口,用于操作和处理文件路径

import os.path

import os.path as op

路径操作

函数

描述

os.path.abspath(path)

返回path在当前系统中的绝对路径

>>>os.path.abspath("file.txt")

'C:\\Users\\Tian Song\\Python36-32\\file.txt'

 

os.path.normpath(path)

归一化path的表示形式,统一用\\分隔路径

>>>os.path.normpath("D://PYE//file.txt")

'D:\\PYE\\file.txt'

 

os.path.relpath(path)

返回当前程序与文件之间的相对路径 (relative path)

>>>os.path.relpath("C://PYE//file.txt")

'..\\..\\..\\..\\..\\..\\..\\PYE\\file.txt'

路径操作

函数

描述

os.path.dirname(path)

返回path中的目录名称

>>>os.path.dirname("D://PYE//file.txt")

'D://PYE'

 

os.path.basename(path)

返回path中最后的文件名称

>>>os.path.basename("D://PYE//file.txt")

'file.txt'

 

os.path.join(path, *paths)

组合path与paths,返回一个路径字符串

>>>os.path.join("D:/", "PYE/file.txt")

'D:/PYE/file.txt'

 

路径操作

函数

描述

 

os.path.exists(path)

判断path对应文件或目录是否存在,返回True或False

>>>os.path.exists("D://PYE//file.txt")

False

 

os.path.isfile(path)

判断path所对应是否为已存在的文件,返回True或False

>>>os.path.isfile("D://PYE//file.txt")

True

 

os.path.isdir(path)

判断path所对应是否为已存在的目录,返回True或False

>>>os.path.isdir("D://PYE//file.txt")

False

路径操作

函数

描述

 

os.path.getatime(path)

返回path对应文件或目录上一次的访问时间

>>>os.path.getatime("D:/PYE/file.txt")

1518356633.7551725

 

os.path.getmtime(path)

返回path对应文件或目录最近一次的修改时间

>>>os.path.getmtime("D:/PYE/file.txt")

1518356633.7551725

 

os.path.getctime(path)

返回path对应文件或目录的创建时间

>>time.ctime(os.path.getctime("D:/PYE/file.txt"))

'Sun Feb 11 21:43:53 2018'

路径操作

函数

描述

 

os.path.getsize(path)

返回path对应文件的大小,以字节为单位

>>>os.path.getsize("D:/PYE/file.txt")

180768

路径操作

os.path.abspath(path) os.path.normpath(path) os.path.relpath(path)

os.path.dirname(path) os.path.basename(path) os.path.join(path)

os.path.exists(path) os.path.isfile(path)

os.path.isdir(path) os.path.getatime(path) os.path.getmtime(path) os.path.getctime(path)

os.path.getsize(path)

os库之进程管理

进程管理

os.system(command)

  • 执行程序或命令command
  • 在Windows系统中,返回值为cmd的调用返回信息

import os os.system("C:\\Windows\\System32\\calc.exe")

import os

进程管理

 

os.system("C:\\Windows\\System32\\mspaint.exe

D:\\PYECourse\\grwordcloud.png"

>>>

0

os库之环境参数

环境参数

获取或改变系统环境信息

函数

描述

 

os.chdir(path)

修改当前程序操作的路径

>>>os.chdir("D:")

 

os.getcwd()

返回程序的当前路径

>>>os.getcwd()

'D:\\'

环境参数

获取操作系统环境信息

函数

描述

 

os.getlogin()

获得当前系统登录用户名称

>>>os.getlogin()

'Tian Song'

 

os.cpu_count()

获得当前系统的CPU数量

>>>os.cpu_count()

8

环境参数

获取操作系统环境信息

函数

描述

 

os.urandom(n)

获得n个字节长度的随机字符串,通常用于加解密运算

>>>os.urandom(10)

b'7\xbe\xf2!\xc1=\x01gL\xb3'

Python语言程序设计

 

 

 

实例14: 第三方库自动安装脚本

 

 

 

 

嵩 天

北京理工大学

 

 

 

 

 

 

 

"第三方库自动安装脚本"问题分析

 

 

CC BY-NC-SA 4.0 嵩天

问题分析

第三方库自动安装脚本

 

  • 需求:批量安装第三方库需要人工干预,能否自动安装?
  • 自动执行pip逐一根据安装需求安装

 

如何自动执行一个程序?例如: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

问题分析

第三方库自动安装脚本

 

库名

用途

pip安装指令

Jieba

中文分词

pip install jieba

Beautiful Soup

HTML和XML解析器

pip install beautifulsoup4

Wheel

Python第三方库文件打包工具

pip install wheel

PyInstaller

打包Python源文件为可执行文件

pip install pyinstaller

Django

Python最流行的Web开发框架

pip install django

问题分析

第三方库自动安装脚本

 

库名

用途

pip安装指令

Flask

轻量级Web开发框架

pip install flask

WeRoBot

微信机器人开发框架

pip install werobot

SymPy

数学符号计算工具

pip install sympy

Pandas

高效数据分析和计算

pip install pandas

Networkx

复杂网络和图结构的建模和分析

pip install networkx

问题分析

第三方库自动安装脚本

 

库名

用途

pip安装指令

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

 

"第三方库自动安装脚本"实例讲解

第三方库自动安装脚本

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

第三方库自动安装脚本

"第三方库自动安装脚本"举一反三

 

 

 


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

举一反三

自动化脚本+

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

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38677310/article/details/82193444