【笔记】《python语言程序设计》——程序设计方法学
一、前言
学习就是一个不断的自下而上,自上而下的过程。
前段时间,学着用python实现网站的数据爬取,隐约get到python的一些语法和用法,感觉就是语法不难,关键在于解决问题的思维。
这是需求驱动后的学习。接下来,就需要对python进行系统地了解。
很早之前搜知乎的时候,就搜到MOOC上的一门《python语言程序设计》课程,讲得很好,而且,我还下载了课件,溜了一遍,感觉就挺有趣的。
趁着有了实战经验,就把这门入门课刷了一遍。果然是门好课!很适合小白入门,并系统学习,整个教学过程循序渐进,深入浅出,提纲挈领,很有意思!
课程是北京理工大学嵩天老师的《python语言程序设计》课程,现在已经开了11次课了。课程每个小视频短则几分钟,最长也不超过20分钟,不容易劝退。每章讲解有复习回顾及小结,在[平台python123]上有每章的练习和测试,直接反馈结果,激发继续学下去的兴趣。
个人感觉,老师说话速度慢了些,调成了2倍速播放,然后,花了大约3天的时间,把所有的视频,课件,练习和测试都刷了一遍,感觉对python的了解更系统了!
趁热打铁,把每章的知识点和练习、测试再进行整理回顾一下。
以下内容均来自课程:[《python语言程序设计》]及[平台python123],感兴趣的看课程视频,亲自练习,效果更好~
二、知识点
1.实例13:体育竞技分析
自顶向下.png比赛规则:
双人击球比赛:A&B,回合制,5局3胜
开始时一方先发球,直至判分,接下来胜者发球
球员只能在发球局得分,15分胜一局
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.random()<probA:
scoreA+=1
else:
serving='B'
else:
if random.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)
main()
结果:
这个程序模拟两个选手A和B的某种竞技比赛
程序运行需要A和B的能力值(以0到1之间的小数表示)
请输入选手A的能力值(0-1):0.45
请输入选手B的能力值(0-1):0.50
模拟比赛的场次:1000
竞技分析开始,共模拟1000场比赛
选手A获胜360比赛,占比36.0%
选手B获胜640比赛,占比64.0%
2.Python程序设计思维
-
计算思维与程序设计
①第3种人类思维特征:逻辑思维(推理和演绎,数学为代表)->实证思维(实验和验证,物理为代表)->计算思维(设计和构造,计算机为代表)
②基于计算机的思维方式:抽象和自动化;
-
计算生态与Python语言
①计算生态:以开源项目为组织形式,充分利用“共识原则”和“社会利他”组织人员,在竞争发展,相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径。
②Python语言提供15万+个第三方库;同一个功能,Python语言提供2个以上第三方库;Python库之间广泛练习,逐级封装;AlphaGo深度学习算法采用Python语言开源;
③优质的计算生态:python123.io
-
用户体验与软件产品
①实现功能 -> 关注体验:编程只是手段,不是目的,程序最终为人类服务;
②提高用户体验的方法:(1)进度展示;(2)异常处理;(3)其他类方法:打印输出、日志文件、帮助信息;
③软件程序 -> 软件产品:用户体验是程序到产品的关键环节;
-
基本的程序设计模式
①从IPO开始;
②自顶向下设计;
③模块化设计;
④配置化设计:程序引擎+配置文件;
⑤从应用需求到软件产品:(1)产品定义;(2)系统架构;(3)设计与实现;(4)用户体验;
3. Python第三方库安装
-
看见更大的python世界:13万+个第三方库(pypi.org)
-
第三方库的pip安装方法(主要方式):适用win、mac和linus等操作系统;适合99%以上情况,需要联网安装;
windows下,
win键+R
——输入cmd
,键入如下命令:常用的pip命令:
安装指定的第三方库 pip install <第三方库名> 使用-U标签更新已安装的指定第三方库 pip install -U <第三方库名> 卸载指定的第三方库 pip uninstall <第三方库名> 下载但不安装指定的第三方库 pip download <第三方库名> 列出某个指定第三方库的详细信息 pip show <第三方库名> 根据关键词在名称和介绍中搜索第三方库 pip search <关键词> 列出当前系统已经安装的第三方库 pip list
-
第三方库的集成安装方法:结合特定Python开发工具的批量安装
- Anaconda(continuum.io):支持近800个第三方库;包含多个主流工具;适合数据计算领域开发;
-
第三方库的文件安装方法:
①为什么有些第三方库用pip可以下载,但无法安装?
- 某些第三方库pip下载后,需要编译再安装;
- 如果操作系统没有编译环境,则能下载但不能安装;
- 可以直接下载编译后的版本用于安装
②UCI页面(lfd.uci.edu/~gohlke/pythonlibs/)
- 实例:安装wordcloud库
- step1:在UCI页面搜索wordcloud
- step2:下载对应版本的文件
- step3:使用pip install <文件名>安装
4. 模块7:os库的基本使用
-
OS库基本介绍:
- 提供通用的、基本的操作系统交互功能;
- Python标准库,包含几百个函数;
- 常用:路径操作、进程管理、环境参数等几类;
-
OS库之路径操作:os.path子库,处理文件路径及信息
-
os.path子库以path为入口,用于操作和处理文件路径
import os.path
或import os.path as op
函数 描述 os.path.abspath(path) 返回path在当前系统中的绝对路径 os.path.normpath(path) 归一化path的表示形式,统一用\\分隔路径 os.path.relpath(path) 返回当前程序与文件之间的相对路径 os.path.dirname(path) 返回path中的目录名称 os.path.basename(path) 返回path中最后的文件名称 os.path.join(path,*paths) 组合path和paths,返回一个路径字符串 os.path.exists(path) 判断path对应文件或目录是否存在,返回True或False os.path.isfile(path) 判断path所对应是否为已存在的文件,返回True或False os.path.isdir(path) 判断path所对应是否为已存在的目录,返回True或False os.path.getatime(path) 返回path对应文件或目录上次访问时间 os.path.getmtime(path) 返回path对应文件或目录最近一次的修改时间 os.path.getctime(path) 返回path对应文件或目录的创建时间 os.path.getsize(path) 返回path对应文件的大小,以字节为单位
-
-
OS库之进程管理:启动系统中其他程序
-
os.system(command)
#打开计算器 import os os.system('C:\\Windows\\System32\\calc.exe')
-
-
OS库之环境参数:获得系统软硬件信息等环境参数
函数 描述 os.chdir(path) 修改当前程序操作的路径 os.getcwd() 返回程序的当前路径 os.getlogin() 获得当前系统登录用户名称 os.cpu_count() 获得当前系统的CPU数量 os.urandom(n) 获得n个字节长度的随机字符串,通常用于加解密运算
5.实例14:第三方库自动安装脚本
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')
三、测试
1.选择题
-
关于计算思维,以下选项描述正确的是:
A 计算思维从古至今一直存在
B 计算思维是基于计算机的思维模式
C 计算思维关于设计和构造,可以脱离计算机而存在
D 计算思维是逻辑思维的演进
计算思维是基于计算机的思维模式,计算机出现之前,由于没有快速计算装置,计算所反映的思维模式主要是数学思维,即通过公式来求解问题。当快速计算装置出现后,计算思维才真正形成。
-
关于Python第三方库安装方法,以下选项描述错误的是:
A 使用pip命令
B 联系第三方库作者索要安装文件
C 访问UCI网站下载安装文件
D 使用集成安装工具
请不要联系作者索要第三方库,这不是获取第三方库的合理模式。
-
自顶向下设计主要由下列哪个语法元素实现?
A 循环结构
B 对象
C 过程
D 函数
函数是自顶向下设计的关键元素,通过定义函数及其参数逐层开展程序设计。
-
关于软件产品和程序的区别,以下描述正确的是:
A 软件产品=程序功能+速度优化
B 软件程序就是软件产品
C 软件产品=程序功能+用户体验
D 从程序功能到软件产品的产品化代价很小
产品不仅需要功能,更需要更好的用户体验。往往,产品都需要综合考虑技术功能和人文设计,这源于产品的商业特性。即,商业竞争要求产品不能只关心技术功能,更要关心用户易用和喜好需求。
-
以下选项对计算思维本质描述正确的是:
A 抽象和执行
B 抽象和自动化
C 计算和思维
D 描述和执行
计算思维的本质是:抽象和自动化。
抽象一个运算过程,以能够按步骤描述为目标;并利用计算机运算的高速特性自动化执行。
-
关于用户体验,以下选项描述正确的是:
A 用户体验不重要,只要有程序功能即可
B 好产品不一定有好的用户体验,关键在于功能创意
C 用户体验是客观的,完全可以靠技术来实现
D 编程只是手段,程序最终为人类服务,用户体验很重要
一个提醒进度的进度条、一个永不抛出异常的程序、一个快速的响应、一个漂亮的图标、一个合适尺寸的界面等都是用户体验的组成部分。总的来说,用户体验是一切能够提升程序用户感受的组成。
-
关于os.path子库,以下选项中用来计算相对路径的函数是:
A os.path.basename(path)
B os.path.normpath(path)
C os.path.abspath(path)
D os.path.relpath(path)
顾名思义:os.path.relpath(path) 是 relative path处理函数。
-
关于os库,以下选项中可以启动进程执行程序的函数是:
A os.system()
B os.run()
C os.start()
D os.process()
除了os.system(),选项其他函数都不存在。
-
以下选项关于计算生态描述错误的是:
A 计算生态主要以开源项目为组织形式
B 计算生态存在竞争发展、相互依存和迅速更迭的特点
C 高质量计算生态需要顶层设计的参与才能保障
D 计算生态类似自然生态,不受单一组织或人物的控制,形成了技术演化路径
计算生态以竞争发展、相互依存和迅速更迭为特点,在开源项目间不存在顶层设计,以类自然界"适者生存"的方式形成技术演进路径。
-
关于Python的os库,以下选项描述正确的是:
A os库提供了路径操作、进程管理等若干类功能
B os库是一个第三方库,需要安装后使用
C os库提供了几十个函数,功能比较有限
D os库仅适用于Windows平台
os库是Python重要的标准库之一,提供了几百个函数功能,覆盖与操作系统、文件操作等相关的众多功能。os库适合所有操作系统。
2.程序设计题
- 英文字符的鲁棒输入
描述:获得用户的任何可能输入,将其中的英文字符进行打印输出,程序不出现错误。
alpha = []
for i in range(26):
alpha.append(chr(ord('a') + i))
alpha.append(chr(ord('A') + i))
s = input()
for c in s:
if c in alpha:
print(c, end="")
注意:这里采用遍历字符的方式实现,通过约束字母表达到鲁棒效果。
- 数字的鲁棒输入
描述:获得用户输入的一个数字,可能是浮点数或复数,如果是整数仅接收十进制形式,且只能是数字。对输入数字进行平方运算,输出结果。
要求:
(1)无论用户输入何种内容,程序无错误;
(2)如果输入有误,请输出"输入有误"。
s = input()
try:
if complex(s) == complex(eval(s)):
print(eval(s)**2)
except:
print("输入有误")
complex()和complex(eval())之间的比较将能够排除非数字类型的输入。
注意:不能直接使用eval(),否则,用户可以通过输入表达式(如100**2)输入数字,与要求不同(在实际应用中带来安全隐患)。
【笔记】《python语言程序设计》—Python基本语法元素