包教包会,7段代码带你玩转Python条件语句

通过图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语句的形式很简单,通过条件判断的结果即可决定下一步的执行方向,具有两条分支。以编写一个账户密码登录界面为例,介绍该语句的使用,如代码清单①所示。



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, 90
    print('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语句时,需要注意以下几点。


  1. 条件判断语句应尽量简单,若语句复杂则应当将运算先放到一个变量中。

  2. Python的条件语句中允许常用的数值比较运算(==,!=,>,>=,<,<=)。

  3. 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后输入异常名即可,如代码清单⑦所示。



In[9]:    # 尝试引发IndexError
    try:
        raise IndexError
    except KeyError:
        print ('in KeyError except')
    except IndexError:
        print('in IndexError except')
    else:
        print('no exception')   

Out[9]:    in IndexError except


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实