8 程序设计方法

8.1 实例13:体育竞技分析

  • 输入:球员的水平,输出:可预测的比赛成绩
  • 自顶向下和自底向上:
    • 自顶向下(设计):
      • 将一个总问题表达为若干个小问题组成的形式
      • 使用同样方法进一步分解小问题
      • 直至,小问题可以用计算机简单明了的解决
    • 自底向上(执行):
      • 分单元测试,逐步组装
      • 按照自顶向下相反的路径操作
      • 直至,系统各部分以紫装的思路都经过测试和验证
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
#MatchAnalysis.py
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 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 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 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 main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
main()

8.2 Python程序设计思维

  • 计算生态与Python语言:
    • 计算思维:抽象问题的计算过程,利用计算机自动化求解
  • 计算生态与Python语言:
    • 以开源项目为代表的大量第三方库
    • 库之间相互关联,依存发展
  • 用户体验与软件产品:
    • 提高用户体验的方法:进度展示、异常处理、打印输出、日志文件、帮助信息
  • 基本的程序设计模式:
    • 从IPO开始:
    • 自顶向下设计
    • 模块化设计
    • 配置化设计
    • 从应用需求到软件产品
      • 产品定义
      • 系统架构
      • 设计与实现
      • 用户体验

8.3 Python第三方库安装

0ApznA.png

  • 常用pip命令
    常用的pip命令

8.4 模块7:OS库的使用

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

0ApX1e.png
0Apj6H.png
0ApbtK.png
0ApqfO.png
0ApOpD.png

  • 进程管理:

    1
    2
    3
    4
    import os
    os.system(command)

    os.system('C:\\Windows\\System32\\Calc.exe')
  • 环境参数:

0ApvXd.png
0A9S0I.png
0A9p7t.png

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

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

8.Practice

  • 英文字符的鲁棒输入:输入字符串,打印输出其中的英文字母
1
2
3
4
5
6
7
s = input()
d = []
for i in range(26):
d.append(chr(ord('a')+i))
for c in s:
if c in d:
print(c,end='')
  • 数字的鲁棒输入:获得用户输入的一个数字,可能是浮点数或复数,如果是整数仅接收十进制形式,且只能是数字。对输入数字进行平方运算,输出结果。
1
2
3
4
5
6
s = input()
try:
if complex(s) == complex(eval(s)):
print(eval(s)**2)
except:
print("输入有误")