本章学习目标

.理解条件表达式、程序异常的概念
.掌握关系、逻辑运算符及表达式
.熟练掌握使用if-else语句、if语句设计简单分支程序的方法
.熟悉os库、math库的常用函数及用法
.理解闪屏问题及其处理的两种常用方法
.熟练掌握使用分支嵌套和if-elif-else语句设计复杂分支程序的方法
.掌握程序异常的处理方法
本章研究分支结构的程序设计。主要介绍关系与逻辑运算、双路分支语句if-else、条件
表达式、单路分支语句if、os库、math库、分支嵌套、多路分支语句if-elif-else、程序异常及其
处理。

3.关系与逻辑运算
1 


扫一扫

3.1.1 
关系运算
1. 
运算符和表达式
关系运算也叫作比较运算。关系运算用来确定两个对象之间的大小关系。关系运算的
结果是逻辑值True或False。Python提供了6个关系运算符,分别是大于(>)、小于(<)、
大于或等于(>= )、小于或等于(<= )、等于(==)和不等于(!=), 如表3-1所示。


表2-
1 
关系运算符和表达式

运算符实施运算优先级表达式
> 大于
x 
>
y 
< 
>= 
小于
大于或等于
高
x 
<
y 
x>=
y 
<= 小于或等于x<=
y 
== 
!= 
等于
不等于
低
x 
==
y x 
!=
y 

2. 
4点说明
(1)关系运算的适用范围。
不是所有类型的数据之间都可进行关系运算。数值型与字符串类型之间、复数与复数
之间不可以进行表2-1所示的前4种运算。
不同数据类型数据间关系运算的程序示例如图3-1所示。


图3-
1 
不同数据类型数据间关系运算的程序示例

在这个程序中,第1条语句是整数1与整数-10 进行比较,结果是True。第2条语句
是浮点数1.5与整数2进行比较,结果是Tu5与浮点数1.

re。第3条语句是浮点数1.25 进
行比较,结果是True。第4条语句是字符串“ab”与字符串“Ab进(”) 行比较,结果是True。第
5条语句是逻辑值Tre与Fle进行比较,2.逻辑值Tuas

uas2.3节中介绍过, re与Fle可以看
作整数1和0,可以比较大小,结果是True。第6条语、第7条语句分别是整数1和字符串
“1”、复数2j与复数-1j之间进行比较,程序运行出错,系统提示整数与字符串之间、复数与
复数之间不支持“>=”和“>”运算。

(2)字符串之间的关系运算。
字符串之间比较大小时,是自左向右逐个比较对应位置字符的Unicode码,只要能确定
结果,就停止比较。

① 对于字母来说,小写字母a的Unicode码是97,大写字母A是65,大写字母之间、小
写字母之间均连续编码,小写字母比与其对应的大写字母的Unicode码大32 。
② 对于数字字符来说,字符0的Unicode码是48,字符0~9也是连续编码。
70

③对于汉字来说,可以理解为是对汉字对应的汉语拼音之间进行比较。
字符串之间关系运算的程序示例如图3-2所示。
图3-
2 
字符串间关系运算的程序示例

在这个程序中,第1条语句是字符串“Abc”与“a比(”) 较,因字母A小于a的Unicode码, 
所以结果为False。第2条语句是字符串“Abc”与“Abd比(”) 较,因为字母c小于d的Unicode 
码,所以结果为True。第3条语句是“123”与“11111”比较,因为数字字符2大于1的
Unicode码,所以结果为False。第4条语句是汉字“大”与“小”比较,可以理解为是它们的
汉语拼音“da”与“xiao”之间比较,因为字母d小于x的Unicode码,所以结果为False。

(3)参与关系运算的对象
。
参与关系运算的对象可以是常量、变量和表达式
。
不同对象之间关系运算的程序示例如图3-3所示
。
图3-
3 
不同对象间关系运算的程序示例

在这个程序中,第1条语句是两个常量1与1.

0之间比较。第2条语句是两个变量
x 
与
y 
之间比较。第3条语句是两个表达式x+10 与y**2之间比较。第4条语句是一个表
达式“123”*2 和一个字符串常量“123123”之间比较。从运行结果可以看出,这些都是合
法的。

(4)比较运算的优先级
。
在6种关系运算中,前4个的优先级相同,后2个的优先级相同。前4个高于后2个
,
但均低于数值运算和字符串运算。可以使用表达式a<=x<=b表示数学里的x∈[a,b]。
不同优先级关系运算的程序示例如图3-4所示。
在这个程序中,第1条语句定义了变量
x 
与y, 5。第2条语

并分别为它们赋值10 和1.

71

图3-
4 
不同优先级关系运算的程序示例

句是两个表达式之间比较,处理的顺序是先处理y*10 得15,再处理x+2 得12,最后处理
12>15,结果是False。第3条语句是“>”和“==”两种运算连用,处理的顺序是先处理
y>1 得True,再处理True==False,结果是False。第4条语句是字符串切片运算与
“!=”连用,处理的顺序是先进行切片得子串“bc,(”) 然后处理“bc”!=“bc,(”) 结果是False。第
5条语句是两个“<=”连用,表示x∈[10,15]的条件,结果为True。第6条语句是两个
“<”连用,表示y∈(2,3)的条件,结果为False。

使用关系运算构造的几个典型表达式示例,如表3-2所示。

表3-
2 
几个典型的关系表达式

关系表达式结果为“真”时表示的条件
x>0 
x 
是正数
x%2==0 
x 
是偶数
x%4==0 
x 
能被4整除(
x 
是4的倍数) 
5<=x<=10 x∈[5,10] 
5<x<10 x∈(5,10) 
"a"<=x<="z" x 
是小写字母
"A"<=x<="Z" x 
是大写字母
"0"<=x<="9" x 
是数字字符


3.1.2 
逻辑运算
1. 
概述
扫一扫

对于复杂的条件,只有关系运算是不够的,往往需要借助逻辑运算来构建。
逻辑运算是对逻辑值实施的运算。在Python中,任何类型的数据均可以作为逻辑值
进行处理。
Python规定: 

.任何非零数字或非空对象都为True。
72

.数字0、空对象以及None都为False。
Nonthon1.
e是Pyn的一个关键字,用它表示空值。有关Noe的更多知识在6.2节
介绍。不
同类型数据可以用作逻辑数据的程序示例参见图3-5。


图3-
5 
逻辑运算的程序示例

2. 
运算符和表达式
Python里提供了3种逻辑运算,如表3-3所示。not、and、or是三个关键字。

表3-
3 
逻辑运算符和表达式

运算符实施运算优先级表达式
not 逻辑非高notexp 
and 逻辑与低exp1andexp2 
or 逻辑或最低exp1orexp2 

逻辑非(not)的优先级最高,逻辑与(and)次之,逻辑或(or)最低。

逻辑非(not)用在一个表达式的前面。逻辑与(and)、逻辑或(or)都用在两个表达式
之间。

.逻辑非(not)
若该表达式的值为True,结果就为False,反之就为True
。
.逻辑与(and)
只有当两个表达式的值都为True时,结果才为True,否则就为False
。
.逻辑或(or) 
只有当两个表达式的值都为False时,结果才为False,否则就为True。
在IDLE 命令交互方式下实施逻辑运算的程序示例如图3-5所示。
图3-5(a)所示的是实施逻辑非(or)运算的程序示例,通过运行结果证明了前面介绍的

任何非零数字或非空对象都为True;数字0、空对象以及None都是False的结论。图3-5(b)所
示的是3种逻辑运算的程序示例。第1条语句定义了变量
x 
与y,分别赋值10 和5。第2 
条语句里x>=5的值为True,notx>=5的结果为False。第3条语句里x>=5的值为
True,y<=3的值为False,所以x>=5andy<=3的结果为False。第4条语句里x>=5 

73

74 
为True,y<=3为False,所以x>=5ory<=3的结果为True。
使用逻辑运算构建的5个较复杂条件表达式的示例如表3-4所示。
表3-4 5个较复杂条件表达式的示例
表示的条件表 达 式
x 是否为自然数(正整数) type(x)==intandx>0 
x 是否为字母“a”<=x<=“z”or“A”<=x<=“Z” 
x 是否满足x∈[5,10] x>=5andx<=10等价于5<=x<=10 
a、b、c 是否构成三角形a+b>candb+c>aanda+c>b 
y 是否闰年(y%4==0andy%100!=0)ory%400==0 
3.1.3 is 运算符
1 . 身份识别码
Python为程序中的每个对象自动生成一个整数类型的身份识别码,用以对对象加以区
分和识别。
通过id函数可以获取对象的身份识别码。该函数的调用格式如下。 
id(对象) 
这里的对象可以是常量、变量、表达式等。
获取对象识别码的程序示例如图3-6所示。
图3-6 获取对象识别码的程序示例
在这个程序中,第1条语句获取了整数常量1的识别码。第2条语句获取了浮点数常
量1.5的识别码。第3条语句获取了字符串常量"ab"的识别码。第4条语句获取了表达式
1+2的识别码。第5条语句获取了变量x 的识别码。这里请注意,变量x 和常量1的识别
码是一样的,因为x 存的数据是1。
2 . is 运算符
is是Python的一个关键字,用它可以判断两个对象的身份识别码是否一致。is运算的
使用方法如表3-5所示。

表3-
5 
is运算符和表达式

运算符实施运算表达式
is 识别码一致ob1isob2 
isnot 识别码不一致ob1isnotob2 

其中,ob1isob2 等价于id(ob1)==id(ob2), 若ob1 和ob2 的识别码相同,则为True, 
否则就为False。ob1isnotob2 等价于id(ob1)! =id(ob2), 若ob1 和ob2 的识别码不相
同,则为True,否则就为False。

和is运算符不同的是,关系运算符“== ”用来判断两个对象的值是否相等
。
使用is和“== ”运算符的程序示例如图3-7所示
。



图3-
7 
使用is和“ =
= 
”运算符的程序示例

在这个程序中,第1条语句用来判断整数1和浮点数1.结果是Tru0的识别码是否相同
0, 
的值是否相等, e。

第2条语句用来判断整数1和浮点数1.结果是False。

3.简单分支程序设计
2 


扫一扫

3.2.1 
双路分支语句if-else 
双路分支也叫作两路分支。双路分支是最常见的分支结构,它是根据某一条件的“真” 
或“假”,从两种情况中选择一个来执行。在Python中,双路分支使用if-else语句实现。if 
与else是两个关键字。

双路分支的简单流程图和语句结构如图3-8所示。


图3-
8 
双路分支简单流程图与语句结构

75

76 
该结构的执行过程是:先处理if后面的条件表达式,如果结果为“真”(True),则执行if后
的语句块1,结束整个结构;如果结果为“假”(False),则执行else后的语句块2,结束整个结构。
应该注意的两个问题如下。
(1)if语句末尾与else后面的冒号是语法结构的一部分,不可以省略。
(2)语句块1和语句块2要比if和else向右缩进一个Tab键位置。
双路分支程序示例如图3-9所示。
图3-9 双路分支程序示例
在这个程序中,第1行是为变量x输入数据的语句。第4~7行是一个双路分支,实现
根据x 的值求y 的值。从运行结果可以看出,第1次执行时输入的数据是100,满足x>10 
的条件,所以执行了if后的y=2*x,输出结果是100和200。第2次执行时输入的数据是
3,不满足x>10的条件,所以执行了else后的y=x**2,输出的结果是3和9。
3.2.2 条件表达式
条件表达式是由if和else组成的表达式。
条件表达式有以下两种常用格式。 
格式1:表达式1 if 条件表达式 else 表达式2 
处理过程是:先处理if后的条件表达式,如果结果为“真”(True),则处理if前的表达式
1,并把它的值作为整个式子的值;如果结果为“假”(False),则处理else后的表达式2,并把
它的值作为整个式子的值。
使用第1种格式的条件表达式程序示例如图3-10所示。
图3-10 使用第1种格式的条件表达式程序示例
在这个程序中,第5行把条件表达式直接作为print函数的一个参数。经过分析可知, 
该条件表达式的作用是求x 与y 的最大值,所以输出的结果是20。

77 
格式2:语句1 if 条件表达式 else 语句2 
处理过程是:先处理if后的条件表达式,如果结果为“真”(True),则执行if前的语句
1,然后结束;如果结果为“假”(False),则执行else后的语句2,然后结束。
使用第2种格式的条件表达式程序示例如图3-11所示。
图3-11 使用第2种格式的条件表达式程序示例
在这个程序中,第4行把两条print语句分别放在了if的前面和else的后面。从运行
结果可以看出,该程序实现的功能与图3-9所示的程序完全相同。比较两个程序的代码不
难看出,引入条件表达式的程序,简化了代码,提高了运行效率。
3.2.3 单路分支语句if 
单路分支是双路分支的特例,它只有if,没有else。
单路分支的简单流程图和语句结构如图3-12所示。
图3-12 单路分支简单流程图与语句结构
该结构的执行过程是:先处理if后面的条件表达式,如果结果为“真”(True),则执行if 
后的语句块,结束该结构;如果结果为“假”(False),则跳过该结构。
单路分支程序示例如图3-13所示。
图3-13 单路分支程序示例

在上面的程序中,第5~6行是单路分支结构,因为x>=10 的条件成立,所以执行if 
后的y-=1,输出的结果是10 和19 。


3.2.4 2 
个标准库模块
os库和math库是Python两个重要的标准库模块,在实际编程中很常用。

扫一扫1. 
os库

os是英文operatingsystem 的缩写。该模块提供了Python与操作系统之间的接口,通
过它可以调用操作系统的一些功能。
本书只介绍os库的两个常用函数system 和_exit,详细情况如表3-6所示。

表3-
6 
os库的两个常用函数及使用方法

函数实现功能
system("cls") 清除屏幕上显示的内容
system("pause") 暂停程序执行,按任意键后继续执行
_exit(n) 结束整个程序的执行

使用os库模块的程序示例如图3-14 所示。在该程序中,第3行引入了os库模块。第
5~7行输出了两行“我喜欢Python”和一个空白行。第9行调用system 函数暂停程序执
行。第11 行调用system 函数清除了之前输出的内容。第13 行输出了一行“我喜欢
Python”。第15 行再次调用system 函数暂停程序执行。第17 行调用_exit函数退出了程
序运行。很显然,第19 行代码是无法执行的。


图3-14 
使用os库模块的程序示例

除了1.还可以通过直接双击程序文件

4节介绍的在IDLE 环境中运行程序的方法外, 
图标的方式来运行程序。使用双击文件图标方式运行程序时,程序的运行结果输出到了命
令窗口中。通常情况下,程序运行结束时命令窗口会自动关闭,导致无法浏览程序的输出情
况,这种现象叫作闪屏。

78

解决闪屏的常用办法有以下两种。

.在程序末尾添加语句:system(au)。p(") se(") 
.在程序末尾添加语句:input("按回车键继续…")。
有关闪屏及其处理方法,视频3.2中有详细的演示和介绍。
2.
2. 
math 
库
math库提供了用于数学运算的常数及常用函数。
math库中的常数如表3-7所示。

表3-
7 
math库中的常数

常数数学表示描述
math.pi π 圆周率,值为3.141592653589793 
math.e e 自然对数,值为2.718281828459045 
math.inf ∞ 正无穷大,负无穷大为-math.inf 
math.nan 非浮点数标记,nan(非数值) 

math库中的常用数值运算函数如表3-8所示。

表3-
8 
math库中的常用数值运算函数

常数数学表示描述
math.fabs(x) |x| 返回x的绝对值
math.fmod(x,y) x%y返回x与y的余数
math.fsum(x1,x2,…) x1+x2+… 返回浮点数的和
math.ceil(x) x返回不小于x的最小整数
math.floor(x) x返回不大于x的最大整数
math.factorial(x) x! 返回x的阶乘
math.gcd(x,y) 返回x与y的最大公约数
math.frexp(x) x=m*2e 返回(m,e) 
math.ldexp(x,y) x*2y返回x*2ymath.modf(x) 返回x的小数和整数部分
math.trunc(x) 返回x的整数部分
math.copysign(x,y) |x|*|y|/y用y的正负号替换x的正负号
math.isclose(x,y) 判断x和y的相似性
math.isfinitde(x) 判断x是有限还是无限
math.isinf(x) 判断x是否为无穷大
math.isnan(x) 判断x是否为非数值(nan) 
math库中常用的三角运算函数如表3-9所示。

79 


表3-
9 
math库中常用的三角运算函数

常数数学表示描述
math.dgre(x) 把用弧度表示的
x 
转换为角度值
math.ridans(x) 把用角度表示的
x 
转换为弧度值
math.hypoot(x,y) 返回(x,y)到坐标原点的距离
math.sin(x) sinx 
返回弧度
x 
的正弦值
math.cos(x) cosx 
返回弧度
x 
的余弦值
math.tan(x) tanx 
返回弧度
x 
的正切值
math.asin(x) arcsinx 
返回弧度
x 
反正弦函数值
math.acos(x) arcosx 
返回弧度
x 
反余弦函数值
math.atan(x) arctanx 
返回弧度
x 
反正切函数值
math.atan2(y,,x) 返回y/
x 
的反正切函数值
math.sinh(x) sinhx 
返回
x 
的双曲正弦函数值
math.cosh(x) coshx 
返回
x 
的双曲余弦函数值
math.tanh(x) tanhx 
返回
x 
的双曲正切函数值
math.asinh(x) arcsinhx 
返回
x 
的反双曲正弦函数值
math.acosh(x) arcoshx 
返回
x 
的反双曲余弦函数值
math.astanh(x) arctanhx 
返回
x 
的反双曲正切函数值

math库中的常用幂及对数运算函数如表3-10所示。

表3-10 
math库中的常用幂及对数运算函数

常数数学表示描述
math.pow(x,y) xy 
返回xy 
math.exp(x) ex 
返回ex 
math.expm1(x) ex 
1 返回ex 
1 
math.sqrt(x) 
x 
返回
x 
math.log(x[.base]) logbasex 
返回底数为base的
x 
的对数值
math.log1p(x) ln(1+x) 返回1+
x 
的自然对数值
math.log2(x) logx 
返回以2为底
x 
的对数值
math.log10(x) log10x 
返回以10为底
x 
的对数值

80

math库中的3个特殊运算函数如表3-11所示。

表3-11 
math库中的3个特殊运算函数

常数数学表示描述
math.erf(x) 2 
π∫
x 
0 e-t2dt 
高斯误差函数
math.erfc(x) 2 
π∫∞ 
0x 
e-t2dt 
余补高斯误差函数
math.gamma(x) ∫∞ 
0x 
xt-1e-xdt 
欧拉第二积分函数


3.2.5 3 
个程序设计实例
扫一扫

1. 
身份识别
【实例3-1】编程实现,提示用户输入姓名,选择性别,根据输入的姓名及选择的性别
(“男”或“女”)输出不同的问候语。如果性别选择“男”,则输出“欢迎**先生!”,否则就输出
“欢迎**女士!” 。

经过分析确定了程序的数据结构,需要用到4个string类型的变量———msg、name 、sex 
和greting,分别用来存储提示信息、姓名、性别和问候语。
该程序算法流程图如图3-15所示。


图3-15 
【实例3-1】的算法流程图

81

程序的完整代码如图3-16 所示。


图3-16 
【实例3-1】的程序代码

在该程序中,第2~8行定义了变量msg,并给它赋值一个多行的字符串。第10 行把提
示输入的姓名存在变量name 中。第11 行使用msg作参数,把提示输入的性别存在变量
sex中。第14~17 行是if-else双路分支结构,实现根据输入的性别生成不同的问候语。

本程序的运行情况,视频3.3中有详细演示。

2.
2. 
求算术平方根
【实例3-2】编程实现,提示用户输入一个整数,输出这个整数和它的算数平方根。

经过对问题的分析,确定了程序的数据结构,需要用到两个变量——— x、sqrX,分别用来

存储输入的整数和与其对应的算术平方根。

该程序算法流程图如图3-17 所示。

程序的完整代码和运行效果,如图3-18 所示。

在该程序中,第3行是引入math模块的语句。第6行是调用eval和input函数给
x 
输

入数据的语句。第9~13 行是if-else双路分支结构,用来实现根据
x 
的值做不同的处理。
第11 行和第13 行用到了2.ormat方法控制输出数据的知识。

5节介绍的使用f

3. 
求算术平方根的改版
【实例3-3】使用单路分支if语句编程实现与【实例3-2】同样的功能。

该程序的数据结构与【实例3-2】完全相同。

程序的算法流程图如图3-19 所示。

程序的完整代码和运行效果如图3-20 所示。

在该程序中,第4行是引入os模块的语句。第7行是调用eval和input函数给x输入

数据的语句。第10~12 行是单路if分支结构,用来实现若
x 
的值为负数,则控制结束程
序。第12 行通过调用os模块的_exit函数结束程序运行。很显然,如果if后面的条件x<0 
成立,则执行if后的第11 行和第12 行,第15 行和第16 行执行不了,反之,若x<0 的条件
不成立,if后的第11 行和第12 行执行不了,就会执行第15 行和第16 行。

82

图3-17 
【实例3-2】的算法流程图


图3-18 
【实例3-2】的程序代码及运行效果

83

图3-19 
【实例3-3】的算法流程图


图3-20 
【实例3-3】的程序代码及运行效果

84

复杂分支程序设
计


3.3
扫一扫

在实际编程时,很多问题的处理往往需要从多个选项中选择一个执行,这样的程序叫作
复杂分支程序。通过分支语句的嵌套可以实现多路分支程序设计。

3.3.1 
分支语句的嵌套
Python允许if-else与if-else之间、if与if-else之间以及if与if之间进行相互嵌套。这
种分支语句中套着分支语句的结构叫作分支语句的嵌套。分支语句的嵌套构成了语句之间
的包含和层次关系,处于最外面的是第1层,包含在第1层里的是第2层…… 依此类推。

if-else语句的3层嵌套结构如图3-21 所示。


图3-21 
if-else语句的3层嵌套结构

通过分支语句的嵌套可以实现多路分支程序设计。
使用if-else嵌套实现4路分支的流程图与语句结构,如图3-22 所示。


图3-22 
使用if-else嵌套实现4路分支的流程图与语句结构

上述结构的执行过程是:如果表达式1和表达式2同时成立,则执行语句块1,结束整
个结构;如果表达式1成立,表达式2不成立,则执行语句块2,结束整个结构;如果表达式1 
不成立,表达式3成立,则执行语句块3,结束整个结构;如果表达式1和表达式3都不成
立,则执行语句块4,结束整个结构。

使用if-else嵌套实现3路分支的程序示例,如图3-23 所示。其中,图3-23(b)是在

85

IDLE 环境下分别运行程序3次的效果截图。


图3-23 
使用if-else嵌套实现3路分支的程序示例

在该程序中,第5~11 行是if-else的两层嵌套结构,实现根据
x 
的值从3个print语句
中选择一个执行。第13 行用到了3.4节介绍的使用it语句防止在双击文件图标方式
运行程序时出现的闪屏问题。
2.npu

3.3.2 
多路分支语句if-elif-else 
从使用if-else语句嵌套实现多路分支的程序结构不难看出,由于程序要写成缩进形式, 
当嵌套的层次较多时,后面的语句就会向右缩进较远的距离。如果语句太长,就可能超出屏
幕显示范围,给浏览代码造成困难。为了解决这一问题,Python提供了if-elif-else语句,使
用它可以非常方便地实现多路分支程序设计。

if-elif-else语句的简单流程图和语句格式如图3-24 所示。


图3-24 
if-elif-else语句的简单流程图和语句格式

该结构的执行过程是:首先处理if后面的条件表达式1,如果结果为“真”(True), 则执
行if后的语句块1,结束整个结构;如果结果为“假”(False), 则处理elif后的条件表达式2, 

86

87 
如果结果为“真”(True)则执行elif后的语句块2,结束整个结构……这样一直进行下去。
如果前面的n-1个条件都不成立,则处理最后一个elif后的条件表达式n,如果结果为
“真”(True),则执行其后面的语句块n,结束整个结构;如果前面的n 个条件都不成立,则执
行else后的语句块n+1,结束整个结构。很显然,该结构是根据条件的“真”(True)或“假” 
(False),从n+1中情况中选择了一个执行。
使用if-elif-else实现多路分支的程序示例如图3-25所示。
图3-25 使用if-elif-else实现多路分支的程序示例
该程序与图3-23中的程序实现的功能完全一样。在该程序中,第5~10行是使用ifelif-
else语句实现的3路分支结构,实现根据x 的值从3个print语句中选择一个执行。由
于if、elif、else都处在同一列上,不存在缩进问题,所以克服了if-else嵌套结构嵌套层次较
多时向右缩进太多的不足。
3.3.3 程序异常处理
程序异常是指程序在运行过程中由于异常情况而引发的运行突然终止和报错的现象。
图3-26所示的程序示例中,因为用户输入的数据不是整数而引发了程序运行出错的问题, 
这就是程序异常。
程序异常会破坏程序运行的稳定性,影响用户正常使用程序的体验,因此必须对程序中
的异常进行处理。
图3-26 发生异常的程序示例
在Python中,使用关键字try和except处理异常。其基本语法格式如下。 
try: 
语句块1

88 
except: 
语句块2 
其中,语句块1是可能出现异常的程序代码,语句块2是异常发生后做出处理的代码。
在程序执行时,若语句块1出现异常情况,就会跳转到语句块2去执行。
对【实例3-2】进行异常处理的程序示例如图3-27所示。
图3-27 程序异常处理的程序示例
比较两个程序的运行结果可以看出,与之前程序不同的是,当输入非法数据时,程序运
行不再突然终止和报错,而是跳转到except执行其后面的语句,输出一条有意义的提示信
息,然后正常结束程序。
3.3.4 3 个程序设计实例
1 . 字符识别
【实例3-4】 使用分支语句的嵌套结构编程,实现把提示用户输入的一个文字或符号
存到ch中,按下列要求输出: 
① 若ch中是字母,则输出“输入的**是字母”。
② 若ch中是数字字符,则输出“输入的**是数字”。
③ 若ch中既不是字母也不是数字字符,则输出“输入的**是其他字符”。
经过对问题的分析,确定了它是一个三选一的分支结构,可以使用两层if-else嵌套实
现。这个程序的数据结构很简单,只需要一个string型的变量ch,用来存储用户输入的
内容。该
程序算法流程图如图3-28所示。
程序的完整代码如图3-29所示。
在该程序中,第7~13行是if-else两层嵌套结构,实现三路分支。第10~13行是内层
if-else结构。在程序执行时,若第7行中if后面的条件成立,则执行第8行,结束程序;若第
7行if后面的条件不成立,则再判断第10行if后的条件,若条件成立,则执行第11行,结束
程序;若条件不成立,就执行第13行,结束程序。
本程序的运行情况,视频3.3.2里有完整演示。
扫一扫