体育竞技分析
体育竞技分析:模拟N场比赛
比赛规则
自顶向下(设计): 解决复杂问题的有效方法
将一个总问题表达为若干个小问题组成的形式,使用同样方法进一步分解小问题,直至小问题可以用计算机简单明了的解决。
自底向上(执行): 逐步组建复杂系统的有效测试方法
分单元测试,逐步组装,按照自顶向下相反的路径操作,直至系统各部分以组装的思路都经过测试和验证。
程序总体框架及步骤
步骤1:打印程序的介绍性信息。 #printInfo()
步骤2:获得程序运行参数:proA, proB, n。 #printInfo()
步骤3:利用球员A和B的能力值,模拟n局比赛。 #simNGames()
步骤4:输出球员A和B获胜比赛的场次及概率。 #printSummary()
def main():
printIntro()
probA,proB,n=getInputs()
winsA,winsB=simNGames(n,proA,proB)
printSummary(winsA,winsB)
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 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 = "B"
return scoreA, scoreB
def gameOver(a, b):
return a == 15 or b == 15
理解自顶向下和自底向上
应用问题的扩展
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 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 = "B"
return scoreA, scoreB
def gameOver(a, b):
return a == 15 or b == 15
def main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
main()
计算思维:(Computational Thinking):计算思维是基于计算机的思维方式
第3种人类思维特征
抽象和自动化
抽象问题的计算过程,利用计算机自动化求解
编程是将计算思维变成现实的手段
从开源运动说起…
开源思想深入演化和发展,形成了计算生态
计算生态以开源项目为组织形式,充分利用“共识原则”和“社会利他”组织人员,
在竞争发展、相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径
没有顶层设计、以功能为单位、具备三个特点
计算生态与Python语言
以开源项目为代表的大量第三方库
Python语言提供 >13万个第三方库
库的建设经过野蛮生长和自然选择
同一个功能,Python语言2个以上第三方库
库之间相互关联使用,依存发展
Python库间广泛联系,逐级封装
社区庞大,新技术更迭迅速
AlphaGo深度学习算法采用Python语言开源
API != 生态
计算生态的价值
创新:跟随创新、集成创新、原始创新
计算生态的运用
刀耕火种 -> 站在巨人的肩膀上
计算生态
优质的计算生态:http://python123.io:
用户体验
实现功能 -> 关注体验
提高用户体验的方法
方法1:进度展示
方法2:异常处理
其他类方法
软件程序 -> 软件产品
用户体验是程序到产品的关键环节
从IPO开始…
自顶向下设计
模块化设计
配置化设计
1 产品定义:对应用需求充分理解和明确定义
产品定义,而不仅是功能定义,要考虑商业模式
2 系统架构:以系统方式思考产品的技术实现
系统架构,关注数据流、模块化、体系架构
3 设计与实现:结合架构完成关键设计及系统实现
结合可扩展性、灵活性等进行设计优化
4 用户体验:从用户角度思考应用效果
用户至上,体验优先,以用户为中心
13万个第三方库 https://pypi.org/
三种方法
#安装指定的第三方库
pip install <第三方库名>
#使用-U标签更新已安装的指定第三方库
pip install –U <第三方库名>
#卸载指定的第三方库
pip uninstall <第三方库名>
#下载但不安装指定的第三方库
pip download <第三方库名>
#列出某个指定第三方库的详细信息
pip show <第三方库名>
#根据关键词在名称和介绍中搜索第三方库
pip search <关键词>
#列出当前系统已经安装的第三方库
pip list
主要方法,适合99%以上情况
集成安装:结合特定Python开发工具的批量安装
Anaconda
https://www.continuum.io
为什么有些第三方库用pip可以下载,但无法安装?
文件安装方法
http://www.lfd.uci.edu/~gohlke/pythonlibs/
实例:安装wordcloud库
- 步骤1:在UCI页面上搜索wordcloud
- 步骤2:下载对应版本的文件
- 步骤3:使用pip install <文件名>安装