Python从入门到精通
上QQ阅读APP看书,第一时间看更新

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 输入非闰年年份的结果