
3.1 条件语句
在Python中条件语句主要就是if语句,常见if语句的结构如下:

当满足条件1时执行语句块1,当满足条件2时执行语句块2,当满足条件3时执行语句块3,其他的情况则执行语句块4,而“[]”括起来的语句是可选的,不是必需的。
3.1.1 简单if语句
下面通过一个简单的例子来介绍if语句的使用,如代码清单3-1所示。
代码清单3-1:简单if语句

上述代码先输入一个字符串,然后判断这个字符串的长度是否为4。假设输入的是“2020”,那么运行结果如下:

再次运行上述代码,此时输入“string”,那么运行结果如下:

此时运行的是另外一个分支,这里需要注意的是这个分支中包含的语句:

这个分支是if关键字下面的语句,称为语句块或代码块,相同的代码块有相同的缩进,如这里缩进了4个空格,这是Python的语法约定。Python的语法约定遵循PEP 8(Python Enhancement Proposals 8)的规范,这个规范的内容比较多,笔者打算在具体的代码中涵盖,而不是生硬地使用单独的章节进行说明。当编写不是同一个代码块的语句时,要另行使用不同的缩进,如下所示:

这句代码换行顶行,说明这句代码不再是if关键字下的语句。执行if语句的流程图如图3-1所示。

图3-1 执行if语句的流程图
3.1.2 else分支的使用
在代码清单3-1中使用如下代码退出程序:

严格来说,这并不是一个好的方法,更好的方法应该是使用else语句。if...else...在许多高级语言中都是经典的语句,Python也是如此,其含义就是二者执行其一。下面用if...else...语句来完成代码清单3-1的功能,如代码清单3-2所示。
代码清单3-2:else分支的使用


这样就能够实现代码清单3-1的功能,而且更加清晰和明朗。运行上述代码,然后输入“2020”,得到的输出结果如下:

if...else...语句的执行流程如图3-2所示。

图3-2 if...else...语句的执行流程
3.1.3 elif分支的使用
if...else...语句是二者选其一,但是现实中可能存在多个分支,如颜料三原色为红色、黄色、蓝色。显然,要判断一种颜色是不是三原色之一,就需要3个判断条件,此时elif分支就起作用了。下面用代码清单3-3来判断某种颜色是否是颜料三原色之一。
代码清单3-3:使用elif分支判断某种颜色是否是颜料三原色之一

运行上述代码,并且输入“黄色”,运行结果如下:

再次运行上述代码,这次输入“紫色”,运行结果如下:

由此可见,分支判断成功了。图3-3可以使读者更加直观地了解if...elif...else语句的执行流程。

图3-3 if...elif...else语句的执行流程
这样就可以对多种情况进行判定,从而根据具体的条件来确定执行哪个语句分支。
注意 对于多条件分支的使用建议
有时候多个条件并不是等价的,而是会出现一定的概率的不同。例如,夏天在饮品店购买饮料时,我们可以选择冰水、常温和温水,选择的概率从大到小依次是冰水、常温和温水。这个时候应该把概率大的条件放在前面,如将冰水作为第一个条件分支,将常温作为第二个条件分支,这样就可以减少对其他分支条件的判断次数,从而提高程序的性能。
3.1.4 条件语句的嵌套
有时候一些判断条件会十分复杂,此时可以考虑使用条件语句的嵌套来完成程序。现在假设需要判断一个年份是否是闰年,那么首先需要考虑什么是闰年。所谓闰年就是2月有29天的年份,它需要满足如下两个条件之一。
• 能被100整除,并且能被400整除的年份。
• 不能被100整除,但能被4整除的年份。
下面通过条件语句的嵌套来完成判断年份是否为闰年的功能,如代码清单3-4所示。
代码清单3-4:条件语句的嵌套,判断是否为闰年

加粗的代码就是嵌套的条件语句,因此,在一些复杂的逻辑中使用适当的嵌套可以简化程序。
注意 if语句的嵌套不应超过3层
一般来说,嵌套不要超过3层。如果嵌套超过3层,那么代码往往是不美观的,也是不容易理解的,它会造成可读性降低。因此,当嵌套超过3层时,应该考虑如何整理代码,从而降低嵌套的层次。