
2.2 选择结构
选择结构是指程序运行时系统根据某个特定条件选择一个分支执行。根据分支的多少,选择结构分为单分支选择结构、双分支选择结构和多分支选择结构。根据实际需要,还可以在一个选择结构中嵌入另一个选择结构。
2.2.1 单分支选择结构
单分支选择结构用于处理单个条件、单个分支的情况,可以用if语句来实现,其一般语法格式如下:
if 表达式:
语句块
其中表达式表示条件,其值为布尔值,在该表达式后面必须加上冒号。语句块可以是单个语句,也可以是多个语句。语句块必须向右缩进,如果包含多个语句,则这些语句必须具有相同的缩进量。如果语句块中只有一个语句,则语句块可以和if语句写在同一行上,即在冒号后面直接写出条件成立时要执行的语句。
if语句的执行流程是:首先计算表达式的值;如果该值为True,则执行语句块,然后执行if语句的后续语句;如果该值为False,则跳过语句块,直接执行if语句的后续语句。整个执行流程如图2-1所示。
【例2.5】 从键盘输入一个年份,判断这一年是不是闰年并输出结果。
【算法分析】

图2-1 if语句的执行流程
闰年是为了弥补因历法规定造成的年度天数与地球实际公转周期的时间差而设立的。普通闰年中能被4整除且不能被100整除的为闰年,世纪闰年中能被400整除的是闰年。如果用year表示年份,则判断闰年的条件可以表示为(year%4==0 and year%100!=0) or year%400==0。
【程序代码】

【代码说明】
在上述程序中,首先将变量leapYear的初始值设置为“不是”,然后从键盘输入一个整数并将其赋予变量year,然后使用if语句检查输入的年份是否满足闰年条件,如果满足,则将变量leapYear的值改为“是”。
【运行结果】

再次运行程序:

2.2.2 双分支选择结构
双分支选择结构用于处理单个条件、两个分支的情况,可以用if-else语句来实现,其一般语法格式如下:
if 表达式:
语句块1
else:
语句块2
其中表达式表示条件,其值为布尔值,在该表达式后面要加上冒号。语句块1和语句块2都可以是单个语句或多个语句,这些语句块必须向右缩进,而且语句块中包含的各个语句必须具有相同的缩进量。
if-else语句的执行流程如下:首先计算表达式的值,如果该值为True,则执行语句块1,否则执行语句块2;执行语句块1或语句块2后接着执行if-else语句的后续语句。整个执行流程如图2-2所示。

图2-2 if-else语句的执行流程
【例2.6】 从键盘输入三角形的3条边长,计算三角形的面积。
【算法分析】
构成三角形的充要条件是任意两边之和大于第三边。用 a、b、c 表示三角形的边长,则构成三角形的充要条件可表示为a+b>c and b+c>a and c+a>b。首先判断能否构成三角形,若能,则可用海伦公式s=来计算三角形的面积[其中p=(a+b+c)/2]。
【程序代码】

【运行结果】

再次运行程序:


为了简化编程,Python还提供了条件运算。条件运算符是一个三目运算符,它有3个运算对象,其一般语法格式如下:
表达式1 if 表达式 else 表达式2
条件运算的规则如下:首先计算if后面表达式的值,如果该值为True,则计算表达式1的值并以该值作为条件运算的结果,否则计算表达式2的值并以该值作为条件运算的结果。
条件运算与3个运算对象构成一个条件表达式,该表达式可以作为运算对象出现在其他表达式中,从而简化程序。
例如,在下面的语句中用条件表达式求出变量x和y中的较大者。
>>> x,y=30,90
>>> x if x>y else y
>>> 90
【例2.7】 输入一个整数,判断它是不是水仙花数。所谓水仙花数是指这样的三位整数,其各位上数字的立方和与这个数本身相等。例如,13+53+33=153,所以153是一个水仙花数。
【算法分析】
要判断一个整数是不是水仙花数,首先要求出该整数在个位、十位和百位上的数字,然后根据条件进行判断。若该整数为n,则其个位数应为a=n%10,十位数应为b=(n//10)%10,百位数应为c=n//100,水仙花数应满足的条件为a**3+b**3+c**3==n。
【程序代码】

【运行结果】

再次运行程序:

2.2.3 多分支选择结构
多分支选择结构用于处理多个条件、多个分支的情况,可以用if-elif-else语句来实现,其一般语法格式如下:


其中表达式1、表达式2、…、表达式n表示条件,它们的值为布尔值,在这些表达式后面要加上冒号;语句块1、语句块2、…、语句块n可以是单个语句或多个语句,这些语句必须向右缩进,而且语句块中包含的多个语句必须具有相同的缩进量。
if-elif-else语句的执行流程如下:首先计算表达式1的值,如果表达式1的值为True,则执行语句块1,否则计算表达式2的值;如果表达式2的值为True,则执行语句块2,否则计算表达式3的值,以此类推。如果所有表达式的值均为False,则执行else后面的语句块n。整个执行流程如图2-3所示。

图2-3 if-elif-else语句的执行流程
【例2.8】 按百分制输入学生成绩,然后将成绩划分为4个等级:85分以上为优秀,70~84分为良好,60~69分为及格,60分以下为不及格,要求从键盘输入成绩后输出相应等级。
【算法分析】
输入的学生成绩可使用浮点数表示并按标准划分为4个分数段,每个分数段对应一个等级,形成4个分支,可以通过多分支结构的if语句进行处理,也可以通过多个单分支选择结构的if语句进行处理。使用多分支结构时,由于各个分支的条件相互排斥,代码更为简洁。
【程序代码】

【运行结果】

再次运行程序:

再次运行程序:

2.2.4 选择结构的嵌套
当使用选择结构控制程序执行流程时,如果有多个条件并且条件之间存在递进关系,则可以在一个选择结构中嵌入另一个选择结构,由此形成选择结构的嵌套。在内层的选择结构中还可以继续嵌入选择结构,嵌套的深度是没有限制的。
在if-else语句中嵌入if-else语句:

在if-else语句中嵌入if语句:

在第一个嵌套结构中,else与第二个if配对;第二个嵌套结构中,else与第一个if配对。也就是说,使用嵌套的选择结构时系统将根据代码的缩进量来确定代码的层次关系。
【例2.9】 编写一个登录程序。从键盘输入用户名和密码,然后对输入的用户名进行验证;如果用户名正确,再对输入的密码进行验证。
【算法分析】
由于要求先验证用户名后验证密码,因此在程序中可以使用嵌套的选择结构,即在外层if语句中验证用户名,如果用户名正确无误,再进入内层if语句验证密码。
【程序代码】

【运行结果】

再次运行程序:

再次运行程序:
