8.程序设计方法学
8.1 实例13:体育竞技分析
“体育竞技分析”问题分析
-
问题分析
-
体育竞技分析
高手过招,胜负只在毫厘之间
- 需求:毫厘是多少?如何科学分析体育竞技比赛?
- IPO
- 输入:球员的水平
- 输出:可预测的比赛成绩
-
体育竞技分析:模拟N场比赛
- 计算思维:抽象+自动化
- 模拟:抽象比赛过程+自动化执行N场比赛
- 当N越大时,比赛结果分析会越科学
-
抽象比赛规则
- 双人击球比赛:A&B,回合制,5局3胜
- 开始时一方先发球,直至判分,接下来胜者发球
- 球员只能在发球局得分,15分胜一局
-
自顶向下和自底向上
-
自顶向下(设计)
-
解决复杂问题的有效方法
-
将一个总问题表达为若干个小问题组成的形式
-
使用同样方法进一步分解小问题
-
直至,小问题可以用计算机简单明了地解决
-
例子:
改善居住条件
分为:种树(简单)、盖楼
盖楼:楼房盖哪里,楼的设计和施工
楼的设计和施工:建筑工人,建筑材料,相关组织监理
-
-
-
自底向上(执行)
-
逐步组建复杂系统的有效测试方法
-
分单元测试,逐步组装
-
按照自顶向下相反的路径操作
-
直至,系统各部分以组装的思路都经过测试和验证
-
例子:
改善居住条件
采购到了建筑材料,有建筑工人对相关楼宇进行建造
建造好后进行测试(对各开发模块进行整合和测试)
形成了大楼
每个区域都这样造楼
-
-
“体育竞技分析”实例解析
-
体育竞技分析
-
程序总体框架及步骤
-
步骤1:打印程序的介绍性信息
-printInfo()
-
步骤2:获得程序运行参数(读入):proA,proB,n
-getInputs()
-
步骤3:利用球员A和B的能力值模拟n局比赛
-simNGames()
-
步骤4:输出球员A和B获胜比赛的场次及概率
-printSummary()
-
-
第一阶段:程序总体框架及步骤
$main()\begin{cases}printInfo()\<-(proA,proB,n)getInputs()\->(proA,proB,n)simNGames()\->(winsA,winsB)printSummary()\end{cases}$
def main(): printInfo() probA,probB,n=getInputs() winsA,winsB=simNGames(n,probA,probB) 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))
-
第二阶段:步骤3 模拟N局比赛
$simNGames()<->simOneGame()$
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
$simOneGame()<->GameOver()$
-
第三阶段
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
-
合并
from random import random 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 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 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 getInputs(): a=eval(input("请输入选手A的能力值(0-1):")) b=eval(input("请输入选手B的能力值(0-1):")) n=eval(input("模拟比赛的场次:")) return a,b,n def printIntro(): print("这个程序模拟两个选手A和B的某种竞技比赛") print("程序运行需要A和B的能力值(以0到1之间的小数表示)") #介绍性内容,提高用户体验 def main(): printIntro() probA,probB,n=getInputs() winsA,winsB=simNGames(n,probA,probB) printSummary(winsA,winsB) main()
-
“体育竞技分析”举一反三
- 举一反三
- 理解自顶向下和自底向上
- 理解自顶向下的设计思维:分而治之
- 理解自底向上的执行思维:模块化集成
- 自顶向下是“系统”思维的简化
- 应用问题的扩展
- 扩展比赛参数,增加对更多能力对比情况的判断
- 扩展比赛设计,增加对真实比赛结果的预测
- 扩展分析逻辑,反向推理,用胜率推算能力?
- 理解自顶向下和自底向上
8.2 Python程序设计思维
计算思维与程序设计
-
计算思维
-
第3种人类思维特征
- 逻辑思维:推理和演绎,数学为代表,A->B B->C A->C
- 实证思维:实验和验证,物理为代表,引力波<-实验
- 计算思维:设计和构造,计算机为代表,汉诺塔递归
-
抽象和自动化
- 计算思维:Computational Thinking
- 抽象问题的计算过程,利用计算机自动化求解
- 计算思维是基于计算机的思维方式
-
例子:
-
计数求和:计算1-100的计数和
逻辑思维:高斯小时候的玩法$s=\frac{(a_1+a_n)n}{2}$
计算思维:现代人用计算机的玩法
s=0 for i in range(1,101): s+=i
-
圆周率的计算
逻辑思维:数学家用近似公式$\pi=\sum_{k=0}^{\infty}[\frac{1}{16^{k}}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})]$
计算思维:随机大量撒点
-
汉诺塔问题
逻辑思维:推导$2^n-1$
计算思维:递归
-
天气预报
以前大部分地方靠实证思维+逻辑思维
现在超级计算机用MM5模型(计算思维)
-
量化分析
如何买股票?
拿出k线图,看到小坑和小峰,代表什么操作
利用经验预测未来的涨跌
这是实证思维+逻辑思维
计算思维:
利用历史大量数据
以机器学习的方法预测涨跌并用计算机完成自动交易
-
-
抽象问题的计算过程,利用计算机自动化求解
- 计算思维基于计算机强大的算力和海量的数据
- 抽象计算过程,关注过程、构造和设计,而非因果
- 以计算机程序设计为实现的主要手段
-
编程是将计算思维变成现实的手段
- 我们既需要以设计和构造为特征的抽象问题的能力
- 也需要以编程为手段的自动化执行方法
-
计算生态与Python语言
-
计算生态
-
从开源运动说起…
- 1983,Richard Stallman启动GNU项目
- 1989,GNU通用许可协议诞生,自由软件时代到来
- 1991,Linus Torvalds发布了Linux内核
- 1998,网景浏览器开源,产生了Mozilla,开源生态逐步建立
- Richard Stallman-大教堂模式,认为软件是高大上的,应该由精英开发,普通用户使用
- Linus Torvalds-集市模式,认为软件任何人可以开发,贡献之后软件服务于大众
- 集市模式是真真正正推动开源运动进一步演进的主要模式
-
开源思想深入演化和发展,形成了计算生态
计算生态以开源项目为组织形式,充分利用“共识原则”和“社会利他”组织人员,在竞争发展、相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径。
-
没有顶层设计、以功能为单位、具备三个特点
- 竞争发展
- 相互依存
- 迅速更迭
-
-
计算生态与Python语言
-
以开源项目为代表的大量第三方库
Python语言提供>15万个第三方库
-
库的建设经过野蛮生长和自然选择
同一功能,Python语言2个以上第三方库
-
库之间相互关联使用,依存发展
Python库间广泛联系,逐级封装
如数据处理领域的Numpy;Matplotlib、Pandas等数据处理的第三方库都是基于它编写的上层功能
-
社区庞大,新技术更迭迅速
AlphaGo深度学习算法采用Python语言开源
-
API(应用程序编写接口)!=生态
API是经过设计的产物,而不是野蛮生长出来的产物
-
-
计算生态的价值
- 创新:跟随->集成->原始
- 加速科技类应用创新的重要支撑
- 发展科技产品商业价值的重要模式
- 国家科技体系安全和稳固的基础
- 创新:跟随->集成->原始
-
计算生态的运用
刀耕火种->站在巨人的肩膀上
- 编程的起点不是算法而是系统
- 编程如同搭积木,利用计算生态为主要模式
- 编程的目标是快速解决问题
- 优质的计算生态推荐:http://python123.io
用户体验与软件产品
-
用户体验
- 实现功能->关注体验
- 用户体验指用户对产品建立的主观感受和认识
- 关心功能实现,更要关心用户体验,才能做出好产品
- 编程只是手段,不是目的,程序最终为人类服务
- 实现功能->关注体验
-
提高用户体验的方法
-
方法1:进度展示
- 如果程序需要计算时间,可能产生等待,请增加进度展示
- 如果程序有若干个步骤,需要提示用户,请增加进度展示
- 如果程序可能存在大量次数的循环,请增加进度展示
-
方法2:异常处理
- 当获得用户输入,对合规性需要检查,需要异常处理
- 当读写文件时,对结果进行判断,需要异常处理
- 当进行输入输出时,对运算结果进行判断,需要异常处理
-
其他类方法
- 打印输出:特定位置,输出程序运行的过程信息
- 日志文件:对程序异常及用户使用进行定期记录
- 帮助信息:给用户多种方式提供帮助信息
-
软件程序->软件产品
用户体验是程序到产品的关键环节
-
基本的程序设计模式
-
基本的程序设计模式
- 从IPO开始
- I:Input输入,程序的输入
- P:Process处理,程序的主要逻辑
- O:Output输出,程序的输出
- 确定IPO:明确计算部分及功能边界
- 编写程序:将计算求解的设计变为现实
- 调试程序:确保程序按照正常逻辑能够正确运行
- 模块化设计
- 通过函数或对象封装将程序划分为模块和模块间的表达
- 具体包括:主程序、子程序和子程序间关系
- 分而治之:一种分而治之、分层抽象、体系化的设计思想
- 紧耦合:两个部分之间交流很多,无法独立存在
- 松耦合:两个部分之间交流较少,可以独立存在
- 模块内部紧耦合,模块间松耦合
- 配置化设计
- 程序引擎+配置文件
- 引擎+配置:程序执行和配置分离,将可选参数配置化
- 将程序开发变成配置文件编写,扩展功能而不修改程序
- 关键在于接口设计,清晰明了、灵活可扩展
- 从IPO开始
-
应用开发的四个步骤
-
从应用需求到软件产品
-
1-产品定义:对应用需求充分理解和明确定义
产品定义,而不仅是功能定义,要考虑商业模式
-
2-系统架构:以系统方式思考产品的技术实现
系统架构,关注数据流、模块化、体系结构
-
3-设计与实现:结合架构完成关键设计及系统实现
结合可扩展性、灵活性等进行设计优化
-
4-用户体验:从用户角度思考应用效果
用户至上,体验优先,以用户为中心
-
-
8.3 Python第三方库安装
看见更大的Python世界
- Python社区
- PyPI
- PyPI:Python Package Index
- PSF(Python Software Foundation维护)维护的展示全球Python计算生态的主站
- 学会检索并利用PyPI,找到合适的第三方库开发程序
- 实例:开发与区块链相关的程序
- 第1步:在pypi.org搜索blockchain
- 第2步:挑选适合开发目标的第三方库作为基础
- 第3步:完成自己需要的功能
- PyPI
- 安装Python第三方库
- 三种方法
- 方法1(主要):使用pip命令
- 方法2:集成安装方法
- 方法3:文件安装方法
- 三种方法
第三方库的pip安装方法
-
pip安装方法
-
使用pip安装工具(命令行下执行)
- 命令行中输入pip -h可以查看帮助信息
-
常用的pip命令
-
pip install <第三方库名>第三方库名>
安装指定的第三方库
-
pip install -U <第三方库名>第三方库名>
使用-U标签更新已安装的指定第三方库
-
pip uninstall <第三方库名>第三方库名>
卸载指定的第三方库
-
pip download <第三方库名>第三方库名>
下载但不安装指定的第三方库
-
pip show <第三方库名>第三方库名>
列出某个指定第三方库的详细信息
-
pip search <关键词>关键词>
根据关键词在名称和介绍中搜索第三方库
-
pip list
列出当前系统已经安装的第三方库
-
-
主要方法,适合99%以上情况
- 适合Windows、Mac和Linux等操作系统
- 未来获取第三方库的方式,目前的主要方式
- 适合99%以上情况,需要联网安装
-
第三方库的集成安装方法
- 集成安装方法
- Anaconda
- 支持近800个第三方库
- 包含多个主流工具
- 适合数据计算领域开发(数据分析数据展示)
- Anaconda
第三方库的文件安装方法
-
文件安装方法
-
为什么有些第三方库用pip可以下载,但无法安装?
- 某些第三方库pip下载后,需要编译再安装
- 如果操作系统没有编译环境,则能下载但不能安装
- 可以直接下载编译后的版本用于安装吗?
-
给出了Windows下一批可以下载,但需编译再安装的第三方库的直接编译后的版本
- 实例:安装wordcloud库
- 步骤1:在UCI页面上搜索wordcloud
- 步骤2:下载对应版本的文件
- 步骤3:使用pip install <文件名> 安装文件名>
- 实例:安装wordcloud库
-
8.4 模块7:os库的使用
os库基本介绍
- os库基本介绍
- os库提供通用的、基本的操作系统(包括windows、linux、macos)交互功能
- os库是Python标准库,包含几百个函数
- 常用路径操作、进程管理、环境参数等几类
- 路径操作:os.path子库,处理文件路径及信息
- 进程管理:启动系统中其他程序
- 环境参数:获得系统软硬件信息等环境参数
- os库提供通用的、基本的操作系统(包括windows、linux、macos)交互功能
os库之路径操作
-
路径操作
-
os.path子库以path为入口,用于操作和处理文件路径
import os.path import os.path as op
-
os.path.abspath(path)
返回path在当前系统中的绝对路径
>>>os.path.abspath(“file.txt”)
‘C:\\Users\\Tian Song\\Python36-32\\file.txt’
-
os.path.normpath(path)
归一化path的表示形式,统一用\\分隔路径
>>>os.path.normpath(“D://PYE//file.txt”)
‘D:\\PYE\\file.txt’
-
os.path.relpath(path)
返回当前程序与文件之间的相对路径(relative path)
>>>os.path.relpath(“C://PYE//file.txt”)
’..\\..\\..\\..\\..\\..\\..\\PYE\\file.txt’
-
os.path.dirname(path)
返回path中的目录名称
>>>os.path.dirname(“D://PYE//file.txt”)
‘D://PYE’
-
os.path.basename(path)
返回path最后的文件名称
>>>os.path.dirname(“D://PYE//file.txt”)
‘file.txt’
-
os.path.join(path,*paths)
组合path与paths,返回一个路径字符串
>>>os.path.join(“D:/”,”PYE/file.txt”)
‘D:/PYE/file.txt’
-
os.path.exists(path)
判断path对应文件或目录是否存在,返回True或False
>>>os.path.exists(“D://PYE//file.txt”)
False
-
os.path.isfile(path)
判断path所对应是否为已存在的文件,返回True或False
>>>os.path.isfile(“D://PYE//file.txt”)
True
-
os.path.isdir(path)
判断path所对应是否为已存在的目录,返回True或False
>>>os.path.isdir(“D://PYE//file.txt”)
False
-
os.path.getatime(path)#a-access访问
返回path对应文件或目录上一次的访问时间
>>>os.path.getatime(“D:/PYE/file.txt”)
1518356633.7551725
-
os.path.getmtime(path)#m-modify修改
返回path对应文件或目录最近一次的修改时间
>>>os.path.getmtime(“D:/PYE/file.txt”)
1518356633.7551725
-
os.path.getctime(path)#c-create创建
返回path对应文件或目录的创建时间
>>>time.ctime(os.path.getctime(“D:/PYE/file.txt”))
‘Sun Feb 11 21:43:53 2018’
-
os.path.getsize(path)
返回path对应文件的大小,以字节为单位
>>>os.path.getsize(“D:/PYE/file.txt”)
180768
-
os库之进程管理
-
进程管理
-
os.system(command)
-
执行程序或命令command
-
在Windows系统中,返回值为cmd的调用返回信息
-
例子:
import os os.system("C:\\Windows\\System32\\calc.exe") #调用了计算机自带的计算器程序,并给出返回值0(指程序正确运行) --- import os os.system("C:\\Windows\\System32\\mspaint.exe D:\\PYECourse\\grwordcloud.png") #使用Windows自带画图程序打开grwordcloud.png文件
-
-
os库之环境参数
-
环境参数
-
获取或改变系统环境信息
-
os.chdir(path)
修改当前程序操作的路径
>>>os.chdir(“D:”)
-
os.getcwd()
返回程序的当前路径
>>>os.getcwd()
‘D:\\’
-
os.getlogin()
获得当前系统登录用户名称
>>>os.getlogin()
‘Tian Song’
-
os.cpu_count()
获得当前系统的CPU数量
>>>os.cpu_count()
8
-
os.urandom(n)
获得n个字节长度的随机字符串,通常用于加解密运算
>>>os.urandom(10)
b’&\xd9\t\x85\xf9\xc7\xf6\x8c\t\xba’
(由于某些字符串不能被有效打印出来,它将会用16进制的形式表示)
-
-
8.5 实例14:第三方库安装脚本
“第三方库安装脚本”问题分析
- 问题分析
- 第三方库自动安装脚本
- 需求:批量安装第三方库需要人工干预,能否自动安装?
- 自动执行pip逐一根据安装需求安装
- 如何自动执行一个程序?例如pip?
- 比如我们要自动安装20个第三方库
- NumPy:N维数据表示和运算;pip install numpy
- Matplotlib:二维数据可视化;pip install matplotlib
- PIL:图像处理;pip install pillow
- Scikit-Learn:机器学习和数据挖掘;pip install sklearn
- Requests:HTTP协议访问及网络爬虫;pip install requests
- Jieba:中文分词;pip install jieba
- Beautiful Soup:HTML和XML解析器;pip install beautifulsoup4
- Wheel:Python第三方库打包工具;pip install wheel
- PyInstaller:打包Python源文件为可执行文件;pip install pyinstaller
- Django:Python最流行的Web开发框架;pip install django
- Flask:轻量级Web开发框架;pip install flask
- WeRoBot:微信机器人开发框架;pip install werobot
- SymPy:数学符号计算工具;pip install sympy
- Pandas:高效数据分析和计算;pip install pandas
- Networkx:复杂网络和图结构的建模和分析;pip install networkx
- PyQt5:基于Qt的专业级GUI开发框架;pip install pyqt5
- PyOpenGL:多平台OpenGL开发接口;pip install pyopengl
- PyPDF2:PDF文件内容提取及处理;pip install pypdf2
- docopt:Python命令行解析;pip install docopt
- PyGame:简单小游戏开发框架;pip install pygame
- 第三方库自动安装脚本
“第三方库安装脚本”实例解析
-
第三方库自动安装脚本
#BatchInstall.py import os libs={"numpy","matplotlib","pillow","sklearn","requests","jieba",\ "beautifulsoup4","wheel","pyinstaller","django","flask","werobot",\ "sympy","pandas","networkx","pyqt5","pyopengl","pypdf2","docopt","pygame"} #try: # for lib in libs: # os.system("pip install "+lib) # print("Successful") #except: # print("Failed Somehow") for lib in libs: try: os.system("pip install "+lib) print("Succeed in installing "+lib) except: print("Failed in installing "+lib)
“第三方库安装脚本”举一反三
- 举一反三
- 自动化脚本+
- 编写各类自动化运行程序的脚本,调用已有程序
- 扩展应用:安装更多第三方库,增加配置文件(如自动轨迹绘制实例)
- 扩展异常检测:捕捉更多异常类型,程序更稳定友好
- 自动化脚本+
测验
单项选择题
-
关于用户体验,以下选项描述正确的是:
A. 好产品不一定有好的用户体验,关键在于功能创意
B. 用户体验是客观的,完全可以靠技术来实现
C. 用户体验不重要,只要有程序功能即可
D. 编程只是手段,程序最终为人类服务,用户体验很重要
D
一个提醒进度的进度条、一个永不抛出异常的程序、一个快速的响应、一个漂亮的图标、一个合适尺寸的界面等都是用户体验的组成部分。总的来说,用户体验是一切能够提升程序用户感受的组成。
-
以下选项关于计算生态描述错误的是:
A. 计算生态类似自然生态,不受单一组织或人物的控制,形成了技术演化路径
B. 计算生态主要以开源项目为组织形式
C. 计算生态存在竞争发展、相互依存和迅速更迭的特点
D. 高质量计算生态需要顶层设计的参与才能保障
D
计算生态以竞争发展、相互依存和迅速更迭为特点,在开源项目间不存在顶层设计,以类自然界”适者生存”的方式形成技术演进路径。
-
以下选项对计算思维本质描述正确的是:
A. 计算和思维
B. 描述和执行
C. 抽象和自动化
D. 抽象和执行
C
计算思维的本质是:抽象和自动化。
抽象一个运算过程,以能够按步骤描述为目标;并利用计算机运算的高速特性自动化执行。
-
关于软件产品和程序的区别,以下描述正确的是:
A. 软件产品=程序功能+用户体验
B. 软件产品=程序功能+速度优化
C. 从程序功能到软件产品的产品化代价很小
D. 软件程序就是软件产品
A
产品不仅需要功能,更需要更好的用户体验。往往,产品都需要综合考虑技术功能和人文设计,这源于产品的商业特性。即,商业竞争要求产品不能只关心技术功能,更要关心用户易用和喜好需求。
-
关于Python第三方库安装方法,以下选项描述错误的是:
A. 使用集成安装工具
B. 使用pip命令
C. 访问UCI网站下载安装文件
D. 联系第三方库作者索要安装文件
D
请不要联系作者索要第三方库,这不是获取第三方库的合理模式。
-
关于Python的os库,以下选项描述正确的是:
A. os库是一个第三方库,需要安装后使用
B. os库提供了路径操作、进程管理等若干类功能
C. os库仅适用于Windows平台
D. os库提供了几十个函数,功能比较有限
B
os库是Python重要的标准库之一,提供了几百个函数功能,覆盖与操作系统、文件操作等相关的众多功能。os库适合所有操作系统。
-
关于os.path子库,以下选项中用来计算相对路径的函数是:
A. os.path.relpath(path)
B. os.path.abspath(path)
C. os.path.basename(path)
D. os.path.normpath(path)
A
顾名思义:os.path.relpath(path) 是 relative path处理函数。
-
关于os库,以下选项中可以启动进程执行程序的函数是:
A. os.process()
B. os.start()
C. os.system()
D. os.run()
C
除了os.system(),选项其他函数都不存在。
-
自顶向下设计主要由下列哪个语法元素实现?
A. 过程
B. 对象
C. 循环结构
D. 函数
D
函数是自顶向下设计的关键元素,通过定义函数及其参数逐层开展程序设计。
-
关于计算思维,以下选项描述正确的是:
A. 计算思维是基于计算机的思维模式
B. 计算思维是逻辑思维的演进
C. 计算思维关于设计和构造,可以脱离计算机而存在
D. 计算思维从古至今一直存在
A
计算思维是基于计算机的思维模式,计算机出现之前,由于没有快速计算装置,计算所反映的思维模式主要是数学思维,即通过公式来求解问题。当快速计算装置出现后,计算思维才真正形成。
程序设计题
-
英文字符的鲁棒输入
描述
获得用户的任何可能输入,将其中的英文字符进行打印输出,程序不出现错误。
输入输出示例
输入 输出 示例 1 *&^123abc0e
abce
string=str(input()) for c in string: if 'A'<=c<='Z' or 'a'<=c<='z': print(c,end="") --- 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)如果输入有误,请输出”输入有误”。
输入输出示例
输入 输出 示例 1 1+2j
(-3+4j)
示例2 abd
输入有误
try: a=str(input()) b=eval(a) if str(b).strip("()")!=a:#处理复数eval后两边加() print("输入有误") else: print(b**2) except: print("输入有误") --- s = input() try: if complex(s) == complex(eval(s)): print(eval(s)**2) except: print("输入有误") complex()和complex(eval())之间的比较将能够排除非数字类型的输入。 注意:不能直接使用eval(),否则,用户可以通过输入表达式(如100**2)输入数字,与要求不同(在实际应用中带来安全隐患)。