Python计算生态
计算思维
实证思维:实验和验证,物理
逻辑思维:推理和演绎,数学
计算思维:设计和构造,计算机
计算思维的本质是抽象abstraction和自动化automation
程序设计方法论
最为有效的方法:自顶而下设计
总问题-小问题-碎片化-组合
羽毛球规则分析:
两个球员在一个有四面边界的场地上用球拍击球。开始 比赛时,其中一个球员首先发球。接下来球员交替击球, 直到可以判定得分为止,这个过程称为回合。当一名球 员未能进行一次合法击打时,回合结束。 n 未能打中球的球员输掉这个回合。如果输掉这个回合的 是发球方,那么发球权交给另一方;如果输掉的是接球 方,则仍然由这个回合的发球方继续发球。 n 总之,每回合结束,由赢得该回合的一方发球。球员只 能在他们自己的发球局中得分。首先达到15分的球员赢 得一局比赛。
①打印程序介绍,main(),printIntro()
#MatchAnalysis.py
def printIntro():
print('模拟羽毛球比赛')
print('程序需要A,B能力值,比赛场数')
②程序参数:probA,probB,n,goal
获得用户输入,getInputs()
def getInputs():
a = eval(input('A能力值')
b = eval(input('B能力值')
n = eval(input('场次n')
return a, b, n
③利用能力值probA,probB,模拟n场比赛,simNgames()是整个程序的核心
def simNgames(n, probA, probB):
winA, winB = 0, 0
for i in range(0, n):
scoreA, scoreB = simOnegame(probA, probB)
if scoreA > scoreB:
winA += 1
else :
winB += 1
return winA, winB
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(scoreA, scoreB):
return scoreA == 15 or scoreB == 15
④输出A,B获胜场数和概率,printOutputs()
原问题化为四个独立函数,每层设计确定参数和返回值为重点,忽略其他细节的过程叫抽象,总体为发现功能并抽象功能的过程
def pritnOutputs(winA, winB):
n = winA + winB
print('共{}比赛'.format(n))
print('A获胜{},获胜概率{}'.format(winA, winA / n))
print('B获胜{},获胜概率{}'.format(winB, winB / n))
自底而上执行
执行中等程序最好的办法是从结构层最底层开始,逐步上升。
先运行和测试每一个基本函数,再测试基础组成的整体函数。
Python使用import保留字辅助开展单元测试
测试gameover()
import MatchAnalysis
MatchAnalysis.gameover(10, 15) #True
MatchAnalysis.gameover(10, 1) #False
测试simOnegame()
MatchAnalysis.simOnegame(.45, .5)
#(9, 15)
MatchAnalysis.simOnegame(.45, .5)
#(15, 13)
计算生态
标准库270
第三方库
基本内置函数
68个内置函数
abs(x)
all(x)
any(x)
bin(x)
bool(x)
chr(x)
complex(i,j)
dict(x)
divmod(x,y)
eval(s)
exec(s) exec(‘a=1+9’) a=10
float(x)
hex(x)
input(x)
int(x)
list(x)
max()
min()
oct(x)
open(filename, r)
ord(x) 返回UNcode值
pow(x, y)
print()
range(1,5,2)
reversed(x) 逆序遍历
round(x)
set([1,1,1]) 转换集合类型
sorted(x) 排序
str()
sum()
type()
web页面元素提取
四个步骤:
读取html文件,getHTMLlines()
解析并提取图片链接,extractImageUrls()
提取到屏幕,showResults()
保存为文件,saveResult()
def main():
inputfile = 'wzry.html'
outputfile = 'wzry_urls.txt'
htmllines = getHTMLlines(inputfile)
imageurls = extractImageUrls(htmllines)
showResult(imageurls)
saveResult(outputfile, imageurls)
getHtmLlines()读取HTML文件内容,将结果转变为分行列表,在open()中加入encoding,采用utf-8打开文件
def getHTMLlines(htmlpath):
f = open(htmlpath, 'r', encoding = 'utf-8')
ls = f.readlines()
f.close()
return ls
extractImageUrls()是程序的核心,用于解析文件并提取图像的Url,观察发现,图像采用img标签显示,例如:<img data-src=“http://shp.qpic.cn/ishow/2735092717/1601197657_84828260_29111_sProdImgNo_1.jpg/200” src=“http://shp.qpic.cn/ishow/2735092717/1601197657_84828260_29111_sProdImgNo_1.jpg/0” width=“215” height=“120” alt=“小乔-天鹅之梦”>
<img开头是图像标签的特点,src=所引导的URL是这个图像的真实位置,通过字符串操作提取其中的图像链接
def extractImageUrls(htmllist):
urls = []
for line in htmllist:
if 'img' in line:
url = line.split('src')[-1].split('"')[1]
if 'http' in url:
urls.append(url)
return urls
showResult()将连接输出到屏幕上
def showResult(urls):
count = 0
for url in urls:
print('第{:2}个url:{}'.format(count, url))
count += 1
saveResult()保存结果到文件
def saveResult(filepath, urls):
f = open(filepath, 'w')
for url in urls:
f.write(url + '\n')
f.close()