
3.2 选择结构
选择结构可以根据条件来控制代码的执行分支,也叫分支结构。Python使用if语句来实现分支结构。
3.2.1 分支结构的形式
分支结构包含单分支、双分支和多分支等形式,流程如图3-2(a)~(c)所示。

图3-2 if语句的选择结构
3.2.2 单分支结构
if语句单分支结构的语法形式如下。

其中:
(1)条件表达式:可以是关系表达式、逻辑表达式、算术表达式等。
(2)语句/语句块:可以是单个语句,也可以是多个语句。多个语句的缩进必须一致。
当条件表达式的值为真(True)时,执行if后的语句(块),否则不做任何操作,控制将转到if语句的结束点。其流程如图3-2(a)所示。
条件表达式最后被评价为bool值True(真)或False(假)。如果表达式的结果为数值类型(0)、空字符串("")、空元组(())、空列表([])、空字典({}),其bool值为False(假),否则其bool值为True(真)。例如,123、"abc"、(1,2)均为True。
【例3.2】 单分支结构示例(if_2desc.py):输入两个数a和b,比较两者的大小,使得a大于b。

程序运行结果如下。

3.2.3 双分支结构
if语句双分支结构的语法形式如下。

当条件表达式的值为真(True)时,执行if后的语句(块)1,否则执行else后的语句(块)2,其流程如图3-2(b)所示。
Python提供了下列条件表达式来实现等价于其他语言的三元条件运算符((条件)?语句1:语句2)的功能:

例如,如果x≥0,则y=x,否则y=0,可以表述为:

【例3.3】 计算分段函数:
此分段函数有以下几种实现方式,请读者自行编程测试。
(1)利用单分支结构实现。

(2)利用双分支结构实现。

(3)利用条件运算语句实现。

3.2.4 多分支结构
if语句多分支结构的语法形式如下。

该语句的作用是根据不同条件表达式的值确定执行哪个语句(块),其流程如图3-2(c)所示。
【例3.4】 已知某课程的百分制分数mark,将其转换为五级制(优、良、中、及格、不及格)的评定等级grade。评定条件如下:

根据评定条件,有以下3种方法实现。
方法一:

方法二:

方法三:

其中,方法一使用关系运算符“>=”,按分数从大到小依次比较;方法二使用关系运算符和逻辑运算符表达完整的条件,即使语句顺序不按比较的分数从大到小依次书写,也可以得到正确的等级评定结果;方法三使用关系运算符“>=”,但按分数从小到大依次比较。
在上述3种方法中,方法一、方法二正确,而且方法一简洁明了,方法二虽然正确,但是存在冗余条件。方法三虽然语法没有错误,但是判断结果错误:根据mark分数所得等级评定结果只有“及格”和“不及格”两种,请读者根据程序流程自行分析原因。
【例3.5】 已知坐标点(x,y),判断其所在的象限(if_coordinate.py)。

程序运行结果如下。

3.2.5 if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套,其一般形式如下。

【例3.6】 计算分段函数:
此分段函数有以下几种实现方式,请读者判断哪些是正确的,并自行编程测试正确的实现方式。
方法一(多分支结构):

方法二(if语句嵌套结构):

方法三:

方法四:

请读者画出每种方法相应的流程图,并进行分析测试。其中,方法一、方法二和方法三是正确的,方法四是错误的。
3.2.6 if语句的典型示例代码
if语句的典型示例代码如表3-1所示。当if或else的语句块仅包含一条语句时,该语句也可以直接写在关键字if或else的同一行后面,以使代码紧凑。
表3-1 if语句的典型示例代码

3.2.7 选择结构综合举例
【例3.7】 输入3个数,按从大到小的顺序排序(if_3desc.py)。
先比较a和b,使得a>b;然后比较a和c,使得a>c,此时a最大;最后比较b和c,使得b>c。

程序运行结果如下。

【例3.8】 编程判断某一年是否为闰年(leapyear.py)。判断闰年的条件是年份能被4整除但不能被100整除,或者能被400整除,其判断流程参见图3-3。

图3-3 闰年的判断条件
方法一:使用一个逻辑表达式包含所有的闰年条件,相关语句如下。

方法二:使用嵌套的if语句,相关语句如下。

方法三:使用if…elif语句,相关语句如下。

方法四:使用calendar模块的isleap()函数来判断闰年,相关语句如下。
