包教包会,7段代码带你玩转Python条件语句
导读:条件语句通过一个或多个布尔表达式的执行结果(真值或假值)决定下一步的执行方向。所谓布尔表达式,即对某个对象进行布尔运算,产生一个bool值。条件语句的运行逻辑为:如果条件被满足(返回真值),可以做某件事情;如果条件不满足(返回假值),就做另一件事情,或什么也不做。
作者:李明江 张良均 周东平 张尚佳
如需转载请联系大数据(ID:hzdashuju)
通过图1,可以对条件语句的运行机制作有一个简单的了解。虚线框内是一个选择结构,此结构中包含一个判断条件和两条执行语句,以及连接各部分的流向线。根据判断条件(布尔表达式)返回值的情况,程序将选择执行语句1或语句2。
▲图1 条件语句结构
在Python中,实现选择结构最普遍的工具是if语句。此外,try语句专门用于异常处理,其内在逻辑也符合选择结构。
01 if、elif与else
if语句中包含3种条件判断句式,即if、elif和else。其中,if与elif部分都包含判断条件,当判断条件都不成立时,程序才能执行else部分的代码。
if语句最基础的形式是if-else,其基本语法格式如下。
if 条件表达式:操作语句1
else:操作语句2
if-else语句常用的参数及说明:
条件表达式:接收布尔表达式,表示判断条件是否成立。无默认值
操作语句:接收操作语句,表示执行一段代码。无默认值
if-else语句执行时,程序首先判断if部分条件表达式的真假。如果条件表达式返回真值,则执行操作语句1;如果返回假值,则执行操作语句2。
if-else语句的形式很简单,通过条件判断的结果即可决定下一步的执行方向,具有两条分支。以编写一个账户密码登录界面为例,介绍该语句的使用,如代码清单①所示。
代码清单① if-else语句实现登录界面
In[1]: name = input ('请输入用户名:')password = input ('请输入密码:')if name == "Lucy" and password == "123456":print ('****登录成功,欢迎!*****')else:print ('-----您的输入有误,登录失败!-----') Out[1]: 请输入用户名:Lucy请输入密码:123-----您的输入有误,登录失败!----- In[2]: name = input ('请输入用户名:')password = input ('请输入密码:')if name == "Lucy" and password == "123456":print ('****登录成功,欢迎!*****')else:print ('-----您的输入有误,登录失败!-----') Out[2]: 请输入用户名:Lucy请输入密码:123456****登录成功,欢迎!*****
在代码清单①中,使用input函数以支持交互式的输入,并在函数括号内插入文字进行了输入提示,增强了登录界面的人性化。在if部分的条件判断式中,使用and运算符进行且运算,只有账户和密码都输入正确才能成功登录,从而增加了安全性。
if-else语句可以缩减为单行形式,其基本语法格式如下。
操作语句1 if 条件表达式 else 操作语句2
if-else语句单行形式语法格式中的参数说明与图1一致。如果条件表达式返回的结果为真,则执行if前面的操作语句1,否则执行else后面的操作语句2。
if-else语句使用单行形式的目的主要在于增加代码的简洁性,其基本使用方法如代码清单②所示。
代码清单② if-else语句的单行形式
In[3]: num1, num2 = 11, 90print('num1加num2为百分数') if 1000 > num1 + num2 >100 else print('num1加num2不为百分数') Out[3]: num1加num2为百分数
if-else语句有明显的缺陷,即只能实现两条分支。实际工作中需要用到的条件分支数目可能难以想象,扩展if语句的分支需要用到elif句式。elif是“else if”的缩写,即“下一条件是否成立?”。
使用elif有简洁、减少过分缩排的效果。将elif代码块放在if和else之间,就组成了if-elif-else语句。理论上,if语句中的elif可以无限多。if-elif-else语句与if-else语句其实是等价的,后者相当于前者中elif个数为0或不执行的情况。由于if-elif-else语句能提供更多条件分支,因此被普遍使用,其基本语法格式如下。
if 条件表达式1:操作语句1
elif 条件表达式2:操作语句2
else:操作语句3
if-elif-else语句语法格式中的参数与上文说明一致。该语句执行时,按照从上到下的顺序,依次检查每个条件表达式返回值的情况,任何一个条件表达式返回真值,就执行该表达式下面的操作语句。若所有条件表达式都返回假值,则执行else下面的操作语句。
if-elif-else语句相对于if-else语句优势明显,可以实现更为复杂的功能。使用if-elif-else语句实现年龄段的判断,如代码清单③所示。
代码清单③ 使用if-elif-else语句实现年龄段的判断
In[4]: age = input('请输入您的年龄:')age = int(age)if age < 18:print('未成年人!')elif age >= 18 and age <= 25:print('青年人!')elif age > 25 and age <= 60:print('中年人!')else:print('老年人!') Out[4]: 请输入您的年龄: 20青年人!
代码清单③通过比较运算符实现了年龄段划分,并能区分年龄段界限,避免逻辑出错。input函数将接收的任何数据类型都默认为str,如果不在该代码中插入转换接收数据类型的语句,程序将无法执行。这是因为,接收的年龄数据会被用于和后续的年龄数值比较,而number与str是无法比较的。
需要说明,if语句还有一种形式是if-if-else,这一形式中的if可以有多个,从而实现多分支。与if-elif-else语句相比,差异不仅仅存在于形式上,性能上也同样有区别,使用多个if的效率更低,它实际上是多重if语句。
if语句支持嵌套,即在一个if语句中嵌入另一个if语句,从而构成不同层次的选择结构。嵌套的意义在于实现多层选择结构。使用嵌套对条件语句的功能有升华作用,这与elif是相似的,elif将有限的条件分支扩展,嵌套则提供了建立多层选择结构的工具,两者分别在不同的维度上提升了if语句的功能性。使用嵌套需要以不同的缩进长度划分代码结构的层次,因此嵌套时要特别注意缩进的规范性。
嵌套选择结构具有很广的应用场景,以下给出一个例子。假设系统中存储了5个用户的身份信息,分别是:来自英国的Tom,35岁;来自法国的Frank,35岁;来自德国的Bob,35岁;来自澳大利亚的Washington,51岁;来自南非的Jane,21岁。
设计一个程序,询问用户的部分信息,在对方不说出自己名字的情况下识别其身份,如代码清单④所示。
代码清单④ 嵌套if-elif-else语句
In[5]: age = input('请输入你的年龄:')age = int(age)if age == 35:nation = input('请输入你的国籍:')if nation == '英国':print('你是Tom! ')elif (nation == '法国'):print('你是Frank! ')else:print('你是Bob! ')elif age == 21:print('你是Jane,来自南非! ')elif age == 51:print('你是Washington,来自澳大利亚! ')else:print('请输入正确年龄值! ') Out[5]: 请输入你的年龄:35请输入你的国籍:法国你是Frank!
从代码清单④可以看到,该程序具有两层选择结构。第1层用于询问年龄,程序通过接收的年龄,可以判断输入者是Jane、Washington或其他3个同龄人中的一个;若收到的值不在这5人年龄范围中,则提示输入出错;若收到的值是3个同龄人的岁数,则进入下一层选择结构,即询问国籍;通过询问国籍,程序可以准确报出输入者的信息。
使用if语句时,需要注意以下几点。
条件判断语句应尽量简单,若语句复杂则应当将运算先放到一个变量中。
Python的条件语句中允许常用的数值比较运算(==,!=,>,>=,<,<=)。
Python允许无限次if语句嵌套,但实际编程中如果必须用到3级到4级嵌套,建议考虑用其他方法编写代码,嵌套超过两层会使程序的运行效率大打折扣。
02 try、except与else
如果运行途中发生错误事件,程序的执行将中断,并创建异常对象。异常是程序在正常流程控制以外采取的动作,当它被引发时,计算机将自动寻找异常处理程序,以帮助程序恢复正常运行。
要保证程序的正常运行,就需要排除错误,错误要么是语法上的,要么是逻辑上的。语法错误的出现表明程序在结构上出现了问题,可以在程序执行前加以纠正。逻辑错误可能是缺少输入或输入不正确,某些情况下,也可能是根据输入无法生成预期的结果。逻辑错误难以预防,必须使用异常处理程序来应对。
计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。Python中定义的异常类型大致分为数值计算错误、操作系统错误、无效数据查询、Unicode相关的错误和警告等几类,如下所示。
Python异常类:
BaseException:所有异常的基类
Exception:常规异常的基类
StandardError:所有的内建标准异常的基类
ArithmeticError:所有数值计算异常的基类
FloatingPointError:浮点计算异常
OverflowError:数值运算超出最大限制
ZeroDivisionError:除零
AssertionError:断言语句失败
AttributeError:对象不包含某个属性
EOFError:没有内建输入,到达EOF标记
EnvironmentError:操作系统异常的基类
IOError:输入/输出操作失败
OSError:操作系统异常
WindowsError:系统调用失败
ImportError:导入模块/对象失败
KeyboardInterrupt:用户中断执行
LookupError:无效数据查询的基类
IndexError:序列中没有此索引
KeyError:映射中没有这个键
MemoryError:内存溢出异常
NameError:未声明/初始化对象
UnboundLocalError:访问未初始化的本地变量
ReferenceError:弱引用试图访问已经垃圾回收了的对象
RuntimeError:一般的运行时异常
NotImplementedError:尚未实现的方法
SyntaxError:语法错误导致的异常
IndentationError:缩进错误导致的异常
TabError:Tab和空格混用
SystemError:一般的解释器系统异常
TypeError:对类型无效的操作
ValueError:传入无效的参数
UnicodeError:Unicode相关的异常
UnicodeDecodeError:Unicode解码时的异常
UnicodeEncodeError:Unicode编码错误导致的异常
UnicodeTranslateError:Unicode转换错误导致的异常
Warning:警告的基类
DeprecationWarning:关于被弃用的特征的警告
FutureWarning:关于构造将来语义会有改变的警告
UserWarning:用户代码生成的警告
PendingDeprecationWarning:关于特性将会被废弃的警告
RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
SyntaxWarning:可疑语法的警告
ImportWarning:用于在导入模块过程中触发的警告
UnicodeWarning:与Unicode相关的警告
BytesWarning:与字节或字节码相关的警告
ResourceWarning:与资源使用相关的警告
异常体系内部有层次关系,即某些异常属于某个异常的子类,该异常又可能是另一异常的子类。较低层次、更具细节的异常是某些异常的子类,这些高层次的异常则称为基类,子类和基类是相对的。Python异常体系中的部分关系如图2所示。
▲图2 Python常见异常体系
在图2中,越下面的异常,其层次越低,细节更明显,它们总有更高层次的基类。
Python使用try语句处理异常,该语句一般包括try、except和else三个句式,组成try-except-else的形式。try部分包含一个尝试执行的代码块,except部分是特定异常的处理对策,else部分则在程序运行正常时执行。
try语句可以视为一种条件分支,与if语句的区别是try语句并不包含条件判断式,执行的流向也不取决于条件表达式,而依赖于代码块能否执行。但其内在逻辑和运行流程与if语句是相似的,符合条件分支的特征,其基本语法格式如下。
try:操作语句1
except 错误类型1:操作语句2
except 错误类型2:操作语句3
else:操作语句4
try语句常用的语法格式及其参数说明如下所示。
try-except-else语句常用的语法格式及其参数说明:
错误类型:接收Python异常名,表示符合该异常则执行下面语句。无默认值
操作语句:接收操作语句,表示执行一段代码。无默认值
运行try-except-else语句时,程序首先执行try代码块,即可能出错的试探性语句,这可能导致致命性错误使得程序无法继续执行;如果try代码块确实无法执行,就可能执行某个except代码块。
执行一个except代码块的条件是,系统捕捉的异常类型和该代码块标识的类型相符合;如果try代码块的语句正常执行,就接着执行else代码块的语句。
如果try部分无法执行,也没有找到相应的except代码块,就将异常消息发送给程序调用端,如Python Shell,Python Shell对异常消息的默认处理则是终止程序的执行并打印具体的出错信息。这也是在Python Shell中执行程序错误后所出现的出错打印信息的由来。
在try语句中,except与else代码块都是可选的。except代码块可以有0或多个;else代码块可以有0或1个。但要注意,else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使用else语句,会引发语法错误。
try语句中没有else时,就构成try-except语句,如代码清单⑤所示。
代码清单⑤ try语句处理除零异常
In[6]: number = 0# 以变量number作被除数,尝试运行除法操作try:print('1.0 / number =', 1.0 / number)# 如果异常是除零异常,输出提示信息except ZeroDivisionError:print('***除数为0***') Out[6]: ***除数为0***
在代码清单⑤中,由于0不能做除数,因此引发了除零异常。except代码块由于给出了ZeroDivisionError的解决方案,因此被执行,程序得以完整地运行。
代码清单⑤所展示的异常之间的层次差别是有意义的,这在程序执行过程中可以体现,如代码清单⑥所示。
代码清单⑥ Python异常层次差异
In[7]: dict1={'a': 1, 'b': 2, 'v': 22}# 尝试索引赋值dict中不存在的值try:x = dict1['y']except LookupError:print('查询错误')except KeyError:print('键错误')else:print(x) Out[7]: 查询错误 In[8]: # 调换LookupError和KeyError处理代码块的顺序dict2={'a': 1, 'b': 2, 'v': 22}# 尝试索引赋值dict中不存在的值try:x = dict2['y']except KeyError:print('键错误')except LookupError:print('查询错误')else:print(x) Out[8]: 键错误
代码清单⑥展示的try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,且在代码清单⑥中将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
除自然发生的异常外,Python中的raise语句可用于故意引发异常。使用该语句引发异常时,只需在raise后输入异常名即可,如代码清单⑦所示。
代码清单⑦ raise语句
In[9]: # 尝试引发IndexErrortry:raise IndexErrorexcept KeyError:print ('in KeyError except')except IndexError:print('in IndexError except')else:print('no exception') Out[9]: in IndexError except
本文摘编自《Python3智能数据分析快速入门》,经出版方授权发布。
延伸阅读《Python3智能数据分析快速入门》
点击上图了解及购买
转载请联系微信:DoctorData
推荐语:本书假设你有一定的数据分析基础,但是没有Python和AI基础,为了帮助你快速掌握智能数据分析需要的技术和方法,书中有针对性地讲解了Python和AI中必须要掌握的知识点,内容由浅入深,循序渐进。从环境配置、基本语法、基础函数到第三方库的安装与使用,对各个操作步骤、函数、工具、代码示例等的讲解非常详尽,确保所有满足条件的读者都能快速入门。
开学季满减福利进行中
长按小程序码发现更多好书
「大数据」内容合伙人之「鉴书小分队」上线啦!
最近,你都在读什么书?有哪些心得体会想要跟大家分享?
数据叔最近搞了个大事——联合优质图书出版商机械工业出版社华章公司发起鉴书活动。
简单说就是:你可以免费读新书,你可以免费读新书的同时,顺手码一篇读书笔记就行。详情请在大数据公众号后台对话框回复合伙人查看。
有话要说?
Q: 关于Python条件语句,你还有什么疑问?
欢迎留言与大家分享
猜你想看?
学霸们在假期里“偷着学”,看的是这些书
从图灵机、图灵测试到人工智能:什么决定了AI能否取代人类?
从概念到应用,终于有人把数据挖掘讲明白了
中国AI人才缺口500万,10本硬核技术书带你上车
更多精彩?
在公众号对话框输入以下关键词
查看更多优质内容!
PPT | 报告 | 读书 | 书单 | 干货
大数据 | 揭秘 | Python | 可视化
AI | 人工智能 | 5G | 区块链
机器学习 | 深度学习 | 神经网络
合伙人 | 1024 | 段子 | 数学 | 高考
据统计,99%的大咖都完成了这个神操作
?
觉得不错,请把这篇文章分享给你的朋友
转载 / 投稿请联系:baiyu@hzbook.com
更多精彩,请在后台点击“历史文章”查看
点击阅读原文,了解更多
包教包会,7段代码带你玩转Python条件语句相关推荐
- 包教包会!7段代码带你玩转Python条件语句(附代码)
来源:大数据 本文约5200字,建议阅读10分钟. 本文介绍了Python条件语句常用的7段代码. [ 导 读 ]条件语句通过一个或多个布尔表达式的执行结果(真值或假值)决定下一步的执行方向.所谓布尔 ...
- sybase不支持的条件表达式_包教包会!7段代码带你玩转Python条件语句(附代码)...
来源:大数据 本文约5200字,建议阅读10分钟. 本文介绍了Python条件语句常用的7段代码. [ 导 读 ]条件语句通过一个或多个布尔表达式的执行结果(真值或假值)决定下一步的执行方向.所谓布尔 ...
- 18段代码带你玩转18个机器学习必备交互工具
(图片有AI科技大本营付费下载自视觉中国) 作者 | 曼纽尔·阿米纳特吉(Manuel Amunategui).迈赫迪·洛佩伊(Mehdi Roopaei) 来源 | 大数据(ID:hzdashuju ...
- 18 段代码带你玩转 18 个机器学习必备交互工具
加密货币 作者:曼纽尔·阿米纳特吉(Manuel Amunategui).迈赫迪·洛佩伊(Mehdi Roopaei) 如需转载请联系大数据(ID:hzdashuju) 01 Jupyter Note ...
- 视频教程-迈向数据科学家:带你玩转Python数据分析-Python
迈向数据科学家:带你玩转Python数据分析 苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门><跟老齐学Python ...
- python 条件语句实例_详解python 条件语句和while循环的实例代码
详解python 条件语句和while循环的实例代码,逻辑,布尔,值为,结束,语句 详解python 条件语句和while循环的实例代码 易采站长站,站长之家为您整理了详解python 条件语句和wh ...
- 他在 B 站有 178 万粉丝,今天免费带你玩转 Python
近几年,编程越来越火,网上也是铺天盖地的免费教程,中小学生都开始投入到学习中,编程学习从娃娃抓起. 甚至有些小学生都做起了 UP 主,教大家学编程. 光从编程的难易度来说,Python 简单& ...
- python不运行一段代码_Python:当满足某个条件而不使用“if”语句时跳过一段代码(计算)...
我有一小段代码,我正试图以更好的方式编写,因为这段代码有很多"if"语句.这是一些大项目的小代码.问题是:在代码运行时,函数"f"."g"或 ...
- python条件语句代码例子_Python 炫技操作:条件语句的七种写法
原标题:Python 炫技操作:条件语句的七种写法 作者 | 写代码的明哥 责编 | 郭芮 有的人说 Python 入门容易,但是精通难的语言,这点我非常赞同. Python 语言里有许多(而且是越来 ...
最新文章
- 002_生活口语积累
- 关于学习Python的一点学习总结(23->跳出循环)
- Java Spring Data Redis实战与配置参数详解 application.properties...
- TestNG或JUnit
- Python寻找给定序列中相差最小的两个数字
- 新建带自定义模板的office文件
- 营销单页程序php,Z-blogPHP单页网站模板|产品营销单页|单品推广
- 药品大数据公司都有哪些?
- Mac版 Adobe PS CC 2019 安装教程
- 【搞定GTD】当前的GTD状态测试
- TM4C123系列ARM单片机开发入门介绍
- mac系统,思科Cisco Anyconnect卸载之后,无法重新安装问题
- 外贸订单支付失败有哪些原因导致?有哪些解决方案?
- PDF如何修改,怎么裁剪页面
- 非amd解决No AMD graphics driver is installed
- Unity批量预设体替换材质球
- fabric链码安装失败
- rdkit 读写分子操作
- php+memcached缓存安装说明
- matlab匿名函数的基本使用
热门文章
- Redis工作笔记-Jedis的基本使用
- Qt工作笔记-QMenu::exec中使用QWidget::mapToGlobal()与QCursor::pos()之间的些许差异
- Qt|C++工作笔记-QVector与Vector去重复的值
- Ubuntu中apt与apt-get命令的区别
- 北京市计算机专修学院,北京计算机专修学院:三大热门专业
- python绘画梦想_用python实现你的绘画梦想
- python多线程爬虫框架_普通爬虫vs多线程爬虫vs框架爬虫,Python爬对比
- 2013年6月份安徽省计算机等级考试二级c语言答案,2013年计算机二级C语言上机试题九及答案...
- 自我理解的KMP 算法 模式匹配
- 操作系统之进程管理:14、读者-写者问题