![Python从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/576/26793576/b_26793576.jpg)
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所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P73_9684.jpg?sign=1739266507-eo4QxlOxUwM3YHs0iFM3dimtvOhDLxFy-0-5ad8370f4f76eb3527c71a61228d57a4)
图4.2 最简单if语句的执行流程
说明
在Python中,当表达式的值为非零的数或者非空的字符串时,if语句也认为是条件成立(即为真值)。具体都有哪些值才是假,可以参见2.3.3节。
下面通过一个具体的实例来解决4.1节给出的应用场景中的第一个要素:判断一个数,除以三余二,除以五余三,除以七剩二。
【例4.1】 判断输入的是不是黄蓉所说的数。(实例位置:资源包\TM\sl\04\01)
使用if语句判断用户输入的数字是不是黄蓉所说的除以三余二,除以五余三,除以七余二的数,代码如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P74_63302.jpg?sign=1739266507-OEdiO8QtGPRk3ki0bCWfnIeZwmNELiEs-0-05b47c750ab438b4eabf66eb69dfa929)
运行程序,当输入23时,效果如图4.3所示;当输入45时,效果如图4.4所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P74_9762.jpg?sign=1739266507-pwARGiACaS9XGC22H8FQ1eFIjWr5tSxN-0-5184a717563b33070239f5f5c3791732)
图4.3 输入的是符合条件的数
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P74_9767.jpg?sign=1739266507-9CcL17yytdrLCdu9dgM9XE2sSYiILPSf-0-c19b9b0c9d2d21efb11fb17b47d43870)
图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")
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P75_9855.jpg?sign=1739266507-1QVR6MNdTSYaZqluckR7qvVLMR06wN7u-0-18b2937c5169408674ea2d528fc1d337)
图4.5 语法错误
(2)使用if语句时,如果在符合条件时,需要执行多个语句,例如,程序的真正意图是以下语句:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P75_63305.jpg?sign=1739266507-XtjF3uYW8Ffflngm7amEyP2jLomMSf2q-0-408179250189fe07f1b269f318a94ab0)
但是,在第二个输出语句的位置没有缩进,代码如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P75_63306.jpg?sign=1739266507-g5QHpAX9X1PkFBw4GsHBopbP71Q8E9dt-0-255ea111e3d33d1169ad8be2ce63094b)
执行程序时,无论bmi的值是否小于18.5,都会输出“您的体重过轻~@_@~”。这显然与程序的本意是不符的,但程序并不会报告异常,因此这种Bug很难被发现。
4.2.2 if…else语句
如果遇到只能二选一的条件,例如,某个公司在发展过程中遇到了“扩张”和“求稳”的抉择,示意图如图4.6所示。
Python中提供了if…else语句解决类似问题,其语法格式如下:
if 表达式: 语句块1 else: 语句块2
使用if…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果满足条件,则执行if后面的语句块,否则,执行else后面的语句块,这种形式的选择语句相当于汉语里的“如果……否则……”,其流程图如图4.7所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P76_9876.jpg?sign=1739266507-5ILEWt9a6LElRrNje7kljsb8tKNON8ki-0-fe62a7746b4c1633f3697be3645e25f2)
图4.6 公司发展面临的抉择
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P76_9877.jpg?sign=1739266507-iaHDtrfSwMIjTadqjmLFCeqLu4fmKMad-0-bcfae7fa4bd6dd0f0d43b2e5bca1ee90)
图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语句判断用户输入的数字是不是黄蓉所说的除以三余二,除以五余三,除以七余二的数,并给予相应的提示,代码如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P77_63308.jpg?sign=1739266507-D0NYJ1QNPnEcZ54AdshVx2TAG2VVQaau-0-4f10f96c3f20356087cff4a0be525935)
运行程序,当输入23时,效果如图4.8所示;当输入32时,效果如图4.9所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P77_9964.jpg?sign=1739266507-YWYTCbLrt1EM9CEuv1megOdPxqcctWwf-0-2d489fec615c2b79ffb71ed48063558a)
图4.8 输入的是符合条件的数
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P77_9969.jpg?sign=1739266507-t2meKbDhk2eyXpRiIzXsV8eU2LS16Q6d-0-e3a8c927cd0792c9a3980ddad595ebe6)
图4.9 输入的是不符合条件的数
注意
在使用else语句时,else一定不可以单独使用,它必须和保留字if一起使用,例如,下面的代码是错误的:
01 else: 02 print(number,"不符合条件")
程序中使用if...else语句时,如果出现if语句多于else语句的情况,那么该else语句将会根据缩进确定该else语句是属于哪个if语句的。例如下面的代码:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P77_63309.jpg?sign=1739266507-eguovWGMdovIpQKao0SsCkrve7Y2lHSm-0-7fba52b0eaac2b1ad650518713a30fa8)
将不输出任何提示信息,这是因为else语句属于第3行的if语句,所以当a小于零时,else语句将不执行。而如果将上面的代码修改为以下内容:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P78_63310.jpg?sign=1739266507-uwNqGi68vyIe3Nqo3i6GZY1GlBMYSYuU-0-f9a29480ab5f80a10dbaadf257474b66)
将输入提示信息“a小于零”。此时,else语句属于第2行的if语句。
4.2.3 if…elif…else语句
大家平时在网上购物时,通常都有多种付款方式以供选择,如图4.10所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P78_10084.jpg?sign=1739266507-ioXZ4oar2GskwQFrBb4Zpr6PuCYS6bBg-0-579da6ad82b0baf450986b2414150bdf)
图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所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P79_10167.jpg?sign=1739266507-VzS3eXr1brVYrNGcEsIIREqpVZz7Cktn-0-15c7580f83d525dd19ca86de67961492)
图4.11 if…elif…else语句的流程图
注意
if和elif都需要判断表达式的真假,而else则不需要判断;另外,elif和else都必须跟if一起使用,不能单独使用。
【例4.3】 根据年龄输出不同的提示。(实例位置:资源包\TM\sl\04\03)
使用if…elif…else多分支语句实现根据用户输入的年龄输出相应的提示信息的功能,代码如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P79_63312.jpg?sign=1739266507-PxC5MtmCNoxEhdbmTgtLyF1E9xpFVqVg-0-49383fc460abea4c16157f81d2fc2f80)
说明
第1行代码中的int()函数用于将用户的输入强制转换成整型。
运行程序,输入一个年龄值,并按Enter键,即可显示相应的提示信息,效果如图4.12所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P80_10249.jpg?sign=1739266507-Vl31GxaMpDwn2do4EFEHiz6Oqh2pw15R-0-987709ad9d3f6ecf0c4c2ca2153a2614)
图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语句,形式如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P80_63313.jpg?sign=1739266507-Nh0a7jpCfnljD2JBi0fFQeKaJRZ8Muog-0-6a0959b91ab70b10d1f8217fd6aef931)
例如,在if…else语句中嵌套if…else语句,形式如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P80_63314.jpg?sign=1739266507-sqUHIg7gkngINA2SQ4dtVrLWMU93ZxUu-0-a9738b2ac0a64a27d02390cabd80689b)
说明
if选择语句可以有多种嵌套方式,开发程序时,可以根据自身需要选择合适的嵌套方式,但一定要严格控制好不同级别代码块的缩进量。
【例4.4】 判断输入的年份是不是闰年。(实例位置:资源包\TM\sl\04\04)
通过使用嵌套的if语句实现判断用户输入的年份是不是闰年的功能,代码如下:
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P81_63316.jpg?sign=1739266507-gNhL6JXaHAST1nwncXjE3xyNMX9MqvXt-0-f2bbac275ce355fd7847cfe703be7c07)
说明
判断闰年的方法是“四年一闰,百年不闰,四百年再闰”。程序使用嵌套的if语句对这3个条件逐一判断,第2行代码首先判断年份能否被4整除,如果不能整除,输出字符串“yyyy年不是闰年”,如果能整除,第3行代码继续判断能否被100整除,如果不能整除,输出字符串“yyyy年是闰年”,如果能整除,第4行代码继续判断能否被400整除,如果能整除,输出字符串“yyyy年是闰年”,如果不能整除,输出字符串“yyyy年不是闰年”。
运行程序,当输入一个闰年年份(如2016)时,效果如图4.13所示;当输入一个非闰年年份(如2018)时,效果如图4.14所示。
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P81_10393.jpg?sign=1739266507-huzeaRosWzKxITSbYWXaNx4i8L8z5Gn1-0-9f4bc032a1f8cf7c22925bc6ef6dad53)
图4.13 输入闰年年份的结果
![](https://epubservercos.yuewen.com/2BBFA5/15253385604107806/epubprivate/OEBPS/Images/Figure-P81_10398.jpg?sign=1739266507-HrQx3hm22zysEJBUCM0LdbsefULjjk7X-0-c385ec6042c39b1a4f8f35a648894a61)
图4.14 输入非闰年年份的结果