程序设计方法

理解掌握Python程序设计思维

编写更有设计感的程序

0x1 实例 体育竞技分析

需求:毫厘是多少,如何可选分析体育竞技比赛

模拟N场比赛

计算思维 :抽象 + 自动化

模拟:抽象比赛过程+自动化执行N场比赛

N越大时,比赛结果分析会越科学

问题分析

比赛规则

双人击球比赛:A&B,回合制,5局3胜

开始时一方先发球,直至判分,接下来胜者发球

球员只能在发球局得分,15分胜一局

自顶向下

将总问题表达为若干小问题的分析方法

是解决复杂问日的有效方法

sziYzd.png

第一阶段

介绍内容,提高用户体验

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

第二阶段

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 sim0neGame(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
def main():
printIntro()
probA,probB, n = getInputs()
winsA,winsB = simNGames(n,probA,probB)
printSummary(winsA,winsB)

最终代码

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


运行结果:

这个程序模拟两个选手A和B的某种竞技比赛
程序运行需要A和B的能力值(以01之间的小数表示)
请输入选手A的能力值(0-1):0.45
请输入选手B的能力值(0-1):0.5
模拟比赛场次:1000
竞技开始分析,共模拟1000场比赛
选手A获胜381场比赛,占比38.1%
选手B获胜619场比赛,占比61.9%

举一反三

理解自顶向下和自底向上

分而治之、模块化集成

自顶向下是系统思维

应用问题的扩展

增加其他能力值

通过胜率反推能力

0x2 Python程序设计思维

###计算思维与程序设计

计算思维

第三种人类思维特征

逻辑思维:推理演绎

实证思维:实验和验证

计算思维:设计和构造

特征

抽象问题和自动化求解

天气预报MM5模型,超算计算,进行预测天气

量化分析 股票

抽象计算过程,关注设计过程

计算生态与python语言

计算生态

先是科学装置

后来开源运动GUN

通用许可协议,自由软件时代到来

linux内核开源

网景浏览器开源,商业软件开源

开源思想深入演化和发展

没有顶层设计、以功能为单位

python语言

大量第三方库

库有竞争发展压力

爬虫requests库的简单易用,使过去的库被淘汰

库之间有广泛联系

Numpy库底层是C语言编写,接口是python

社区庞大

API 不等于 生态,API是由人设计的

计算生态价值

加速科技类应用创新的重要支撑

发展科技产品商业价值的重要模式

国家科技体系安全和稳固的基础

编程的起点

学会站在巨人的肩膀上

编程的起点不是算法而是系统

以计算生态为主要运用

优质计算生态 http://python123.io

用户体验与软件产品

用户体验值用户对产品建立的主观感受和认识

提高用户体验的方法

增加进度展示 在程序需等待时,或者有若干步时、存在大量循环时

异常处理 判段输入合理性,当读写文件时,当需输入输出时

打印输出 输出程序过程,使用户了解自己的操作效果

基本的程序设计模式

IPO

确定IPO:明确计算部分及功能边界

编写程序:将计算求解的计划变成现实

调试程序:确保程序按照正确逻辑能过正确运行

自顶向下设计

模块设计

主程序和子程序、分治

紧耦合、松耦合

配置化设计

程序引擎 + 数据配置文件

程序和参数分离,只改变参数,即可

应用开发

产品定义、系统架构、设计与实现、用户体验

定义产品

应用需求充分理解和明确定义

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

系统架构

以系统方式思考产品的技术实现

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

设计与实现

结合架构完成关键设计及系统实现

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

用户体验

从用户角度思考,改善用户体验

0x3 Python第三方库安装

python第三方库获得

全球第三方库社区 https://pypi.org/

PyPI : Python Package Index

PSF维护的展示全球的Python计算生态的主站

实例 开发与区块链相关

搜索 blockchain

挑选 适合开发目标的第三方库作为基础

完成 自己需要的功能

第三方库的安装

pip安装方法

使用pip安装工具,最常用

需联网

三方平台均可

cmd 命令行

常用pip指令

pip install -U 第三方库名 
//-使用—U标签更新已安装的指定第三方库
pip uninstall <第三方库名>
//卸载指定第三方库
pip dounload <第三方库名>
//下载但不安装指定的第三方库
pip show <第三方库名>
//列出某个指定第三方库的详细信息
pip search <关键词>
//根据关键词在名称和介绍中搜索第三方库
如 :pip search blockchain

出现错误一般与网络环境有关们可以换个网络连接,或者换个时间

集成安装方法

Anaconda 开发环境

https://www.continuum.io

支持近800个第三方库

包含多个主流工具

适合数据计算领域开发

文件安装方法

有些第三方库pip下载后,需要编译再安装

如果没有编译环境则只能下载不能安装

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

编译过的安装包

下载在指定文件夹后,pip 安装

0x4 模块 os库的基本使用

os库的基本介绍

与操作系统相关

Python标准函数、几百个函数

基本功能

路径操作:os.path子库,处理文件路径及信息

进程管理:启动系统中其他信息

环境参数:获得系统软硬件信息等环境参数

路径操作

import os.path
或者
import os.path as op #op 子库设置别名

yS2yJH.png

yS2TYQ.png

ySRilR.png

ySRJ78.png

ySRsBV.png

进程管理

os.system(command)

执行程序或命令command

在windows系统中,返回值为cmd的调用返回信息

实例 打开计算器程序

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

返回0,计算器被打开

环境参数

获取或改变操作系统中的环境信息

ySfAIO.png

ySfFZ6.png

ySfKsI.png

0x5 实例第三方库安装脚本

第三方自动安装脚本

需求 自动执行pip,逐一安装第三方库

问题假设

将要安装20个第三方库

yShPpQ.png

yShmkT.png

yShMp4.png

yShw1H.png

代码

import os
libs = {"numpy","matplotlib","pillow","sklearn","requests",\
"jieba","beautifulsoup4","wheel","networkx","sympy",\
"pyinstaller","django","flask","werobot","pyqt5",
"pandas","pypopengl","pypdf2","docopt","pygame"}
try:
for lib in libs:
os.system("pip install" +" "+ lib)
print("Successful")
except:
print("Failed Somehow")

举一反三

自动化脚本 +

编写各类自动执行程序的脚本

扩展应用为引擎配置文件

识别失败信息