4.2 选择语句
在生活中,我们总是要做出许多选择,程序也是一样。下面给出几个常见的例子:
如果购买成功,用户余额减少,用户积分增多。
如果输入的用户名和密码正确,则提示登录成功,进入网站,否则,提示登录失败。
如果用户使用微信登录,则使用微信扫一扫;如果使用QQ登录,则输入QQ号和密码;如果使用微博登录,则输入微博账号和密码;如果使用手机号登录,则输入手机号和密码。
以上例子中的判断就是程序中的选择语句,也称为条件语句。即按照条件选择执行不同的代码片段。Python中选择语句主要有3种形式,分别为if语句、if…else语句和if…elif…else多分支语句,下面将分别对它们进行详细讲解。
说明
在其他语言(如C、C++、Java等)中,选择语句还包括switch语句,也可以实现多重选择。但是,在Python中却没有switch语句,所以实现多重选择的功能时,只能使用if…elif…else多分支语句或者if语句的嵌套。
4.2.1 最简单的if语句
Python中使用if保留字来组成选择语句,其最简单的语法形式如下:
if 表达式: 语句块
其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式(例如,a > b and a!= c),如果表达式的值为真,则执行“语句块”;如果表达式的值为假,就跳过“语句块”,继续执行后面的语句,这种形式的if语句相当于汉语里的“如果……就……”,其流程图如图4.2所示。
图4.2 最简单if语句的执行流程
说明
在Python中,当表达式的值为非零的数或者非空的字符串时,if语句也认为是条件成立(即为真值)。具体都有哪些值才是假,可以参见2.3.3节。
下面通过一个具体的实例来解决4.1节给出的应用场景中的第一个要素:判断一个数,除以三余二,除以五余三,除以七剩二。
【例4.1】 判断输入的是不是黄蓉所说的数。(实例位置:资源包\TM\sl\04\01)
使用if语句判断用户输入的数字是不是黄蓉所说的除以三余二,除以五余三,除以七余二的数,代码如下:
运行程序,当输入23时,效果如图4.3所示;当输入45时,效果如图4.4所示。
图4.3 输入的是符合条件的数
图4.4 输入的是不符合条件的数
说明
使用if语句时,如果只有一条语句,语句块可以直接写到冒号“:”的右侧,例如下面的代码:
if a > b:max = a
但是,为了程序代码的可读性,建议不要这么做。
常见错误:
(1)if语句后面未加冒号。例如下面的代码:
01 number = 5 02 if number == 5 03 print("number的值为5")
运行后,将产生如图4.5所示的语法错误。
解决的方法是在第2行代码的结尾处添加英文半角的冒号。正确的代码如下:
04 number = 5 05 if number == 5: 06 print("number的值为5")
图4.5 语法错误
(2)使用if语句时,如果在符合条件时,需要执行多个语句,例如,程序的真正意图是以下语句:
但是,在第二个输出语句的位置没有缩进,代码如下:
执行程序时,无论bmi的值是否小于18.5,都会输出“您的体重过轻~@_@~”。这显然与程序的本意是不符的,但程序并不会报告异常,因此这种Bug很难被发现。
4.2.2 if…else语句
如果遇到只能二选一的条件,例如,某个公司在发展过程中遇到了“扩张”和“求稳”的抉择,示意图如图4.6所示。
Python中提供了if…else语句解决类似问题,其语法格式如下:
if 表达式: 语句块1 else: 语句块2
使用if…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果满足条件,则执行if后面的语句块,否则,执行else后面的语句块,这种形式的选择语句相当于汉语里的“如果……否则……”,其流程图如图4.7所示。
图4.6 公司发展面临的抉择
图4.7 if…else语句流程图
技巧
if…else语句可以使用条件表达式进行简化,例如下面的代码:
01 a = -9 02 if a > 0: 03 b = a 04 else: 05 b = -a 06 print(b)
可以简写成:
01 a = -9 02 b = a if a>0 else -a 03 print(b)
上段代码主要实现求绝对值的功能,如果a > 0,就把a的值赋值给变量b,否则将−a赋值给变量b。使用条件表达式的好处是可以使代码简洁,并且有一个返回值。
下面对实例4.1进行改进,加入:如果输入的数不符合条件,则给出提示的功能。
【例4.2】 判断输入的是不是黄蓉所说的数(续)。(实例位置:资源包\TM\sl\04\02)
使用if…else语句判断用户输入的数字是不是黄蓉所说的除以三余二,除以五余三,除以七余二的数,并给予相应的提示,代码如下:
运行程序,当输入23时,效果如图4.8所示;当输入32时,效果如图4.9所示。
图4.8 输入的是符合条件的数
图4.9 输入的是不符合条件的数
注意
在使用else语句时,else一定不可以单独使用,它必须和保留字if一起使用,例如,下面的代码是错误的:
01 else: 02 print(number,"不符合条件")
程序中使用if...else语句时,如果出现if语句多于else语句的情况,那么该else语句将会根据缩进确定该else语句是属于哪个if语句的。例如下面的代码:
将不输出任何提示信息,这是因为else语句属于第3行的if语句,所以当a小于零时,else语句将不执行。而如果将上面的代码修改为以下内容:
将输入提示信息“a小于零”。此时,else语句属于第2行的if语句。
4.2.3 if…elif…else语句
大家平时在网上购物时,通常都有多种付款方式以供选择,如图4.10所示。
图4.10 购物时的付款页面
图4.10中提供了3种付款方式,这时用户就需要从多个选项中选择一个。在开发程序时,如果遇到多选一的情况,则可以使用if…elif…else语句,该语句是一个多分支选择语句,通常表现为“如果满足某种条件,进行某种处理,否则,如果满足另一种条件,则执行另一种处理……”。if…elif…else语句的语法格式如下:
if 表达式1: 语句块1 elif 表达式2: 语句块2 elif 表达式3: 语句块3 ... else: 语句块n
使用if…elif…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果表达式为真,则执行语句;而如果表达式为假,则跳过该语句,进行下一个elif的判断,只有在所有表达式都为假的情况下,才会执行else中的语句。if…elif…else语句的流程如图4.11所示。
图4.11 if…elif…else语句的流程图
注意
if和elif都需要判断表达式的真假,而else则不需要判断;另外,elif和else都必须跟if一起使用,不能单独使用。
【例4.3】 根据年龄输出不同的提示。(实例位置:资源包\TM\sl\04\03)
使用if…elif…else多分支语句实现根据用户输入的年龄输出相应的提示信息的功能,代码如下:
说明
第1行代码中的int()函数用于将用户的输入强制转换成整型。
运行程序,输入一个年龄值,并按Enter键,即可显示相应的提示信息,效果如图4.12所示。
图4.12 if…elif…else多分支语句的使用
说明
使用if选择语句时,尽量遵循以下原则:
(1)当使用布尔类型的变量作为判断条件时,假设布尔型变量flag,例如较为规范的书写:
if flag: # 表示为真 if not flag: # 表示为假
不符合规范的书写,例如:
if flag == True: if flag == False:
(2)使用“if 1 == a:”这样的书写格式可以防止错写成“if a = 1:”这种形式,以避免逻辑上的错误。
4.2.4 if语句的嵌套
前面介绍了3种形式的if选择语句,这3种形式的选择语句之间都可以互相嵌套。例如,在最简单的if语句中嵌套if…else语句,形式如下:
例如,在if…else语句中嵌套if…else语句,形式如下:
说明
if选择语句可以有多种嵌套方式,开发程序时,可以根据自身需要选择合适的嵌套方式,但一定要严格控制好不同级别代码块的缩进量。
【例4.4】 判断输入的年份是不是闰年。(实例位置:资源包\TM\sl\04\04)
通过使用嵌套的if语句实现判断用户输入的年份是不是闰年的功能,代码如下:
说明
判断闰年的方法是“四年一闰,百年不闰,四百年再闰”。程序使用嵌套的if语句对这3个条件逐一判断,第2行代码首先判断年份能否被4整除,如果不能整除,输出字符串“yyyy年不是闰年”,如果能整除,第3行代码继续判断能否被100整除,如果不能整除,输出字符串“yyyy年是闰年”,如果能整除,第4行代码继续判断能否被400整除,如果能整除,输出字符串“yyyy年是闰年”,如果不能整除,输出字符串“yyyy年不是闰年”。
运行程序,当输入一个闰年年份(如2016)时,效果如图4.13所示;当输入一个非闰年年份(如2018)时,效果如图4.14所示。
图4.13 输入闰年年份的结果
图4.14 输入非闰年年份的结果