
3.5 控制语句
任何编程语言,都具有三种基本控制语句结构。
① 顺序控制结构(Sequential Structure):按照语句的编写顺序执行程序;
② 条件控制结构(Conditional Structure):按照一个布尔表达式的值(真/假),有选择地执行两个子程序中的一个;
③ 循环控制结构(Loop Structure):以某个布尔表达式的值为循环条件,只要其值为真,则一直执行某个子程序。
下面我们主要讲解一下在Python中如何实现选择结构、循环结构。
3.5.1 条件控制结构(if…else)
在Python中,实现条件控制的语句是if…else语句,条件语句控制结构流程图见图3-10。其基本语法形式是:


图3-10 条件语句控制结构流程图
开发者需要注意以下两点:
语句块1、语句块2中的多条语句的缩进必须一致,否则程序会只执行部分语句,可能引发异常或逻辑错误;
表达式两边可以没有小括号,但是从可读性方面考虑,建议添加。
在实际开发中,if…else语句可以有以下几种应用形式:
① 单分支(无else情况);
② 双分支;
③ 多分支;
④ 嵌套if语句。
3.5.1.1 单分支形式
单分支形式是最简单的if…else语句结构形式,其语句格式如下:

这种形式用于有条件地执行特定操作,即如果表达式为真,则执行下面的语句块,否则跳过,转而去执行if语句结构下面其他语句。单分支条件语句控制结构流程图见图3-11。

图3-11 单分支条件语句控制结构流程图
如下面的例子:

输出结果为:

3.5.1.2 双分支形式
双分支形式语句格式如下:

举例如下:

上面的代码中,x<y为条件表达式,输出结果为:0

3.5.1.3 多分支形式
适合多分支形式语句格式如下:

多分支条件语句控制结构流程图见图3-12。

图3-12 多分支条件语句控制结构流程图
如某个电商平台根据注册用户的月均消费额度进行等级划分,代码如下:

3.5.1.4 嵌套形式
可以把一个if...else结构编写到另外一个if...else语句结构中,形成所谓的嵌套形式,这对于比较复杂的判断特别有用。由于语句的缩进是区别不同嵌套层次的唯一方法,因此嵌套层次越多,可读性越差,在实际编程中,尽量避免多层嵌套。
嵌套形式的if...elf语句的格式如下:

嵌套可以放在If子句、elif子句、else子句下。下面举例说明。

如果输入78,则输出如下:

另外,在Python中,没有类似C++、Java中的switch语句。
3.5.2 循环控制结构(for/while)
循环控制结构是指在满足某个条件下重复执行指定语句的结构。Python中有两种循环控制结构,分别是for循环和while循环。
3.5.2.1 for循环
for循环非常适合对可迭代对象(如列表list、元组tuple、字符串str等)进行遍历。其基本语法如下:

同if...else语句一样,这里的语句块也是通过代码缩进与其他语句进行区分的。
for循环控制结构流程图如图3-13所示。

图3-13 for循环控制结构流程图
下面的例子是计算一个数值型列表中所有数据的算术平均值:

第13~15行为循环体,主要作用是计算总和及元素个数。输出结果如下:

另外,for循环可以有一个可选的else语句块,这个else语句块会在序列sequence中的元素循环完毕后执行。如:

输出结果如下:

3.5.2.2 while循环
while循环语句的语法格式如下:

在while循环中,首先判断条件表达式是否为真(True),只有条件表达式为真时,while语句块才能被执行。执行完一次后,再次判断条件表达式是否为真,如果为真,则再次执行while语句块,依此循环,直到条件表达式为假(False)才退出while循环。While循环控制结构的流程图见图3-14。

图3-14 while循环控制结构流程图
例如:

输出结果如下:

同for循环一样,while循环也可以有一个可选的else语句块,这个else语句块是在条件表达式为假时执行的。如:

输出结果如下:

在while循环中,如果条件表达式一直为真,则一直循环。
3.5.3 转移控制结构
在Python中有几个能够控制程序流程转移的特殊语句,分别是break、continue、return和pass。
3.5.3.1 break/continue
有时我们希望在某次循环中停止当前循环或跳出整个循环语句,这时continue或break就派上了用途。
break语句可把流程转移到循环体后的代码中,从而退出包含它的循环体,其流程如图3-15所示。

图3-15 break语句流程
图3-16所示为for循环结构中break语句转向图。

图3-16 for循环结构中break语句转向图
举例如下:

程序在for循环体内运行时,每次循环会判断flag是否等于“a”,当执行break语句时,会跳出循环体,直接执行循环体后面的代码。最终输出结果如下:

与break语句相比,continue语句在条件为真时只跳过continue后的语句,转而进行下一次循环,并不会退出包含它的循环体。continue语句的流程图见图3-17。

图3-17 continue语句流程图
图3-18所示为for循环中的continue语句转向图:

图3-18 for循环中continue语句转向图
举例如下:

最终输出结果如下:

从上面的输出结果可以看出,当条件为真(flag=='a')时,continue只是在本次循环不执行其后的语句,并不影响下次循环执行其后的语句,更没有退出整个循环。
3.5.3.2 pass
在Python语言中,pass是一个比较特殊的语句,解释器会执行这个语句,但是不做任何操作,所以pass通常是作为占位符来出现的。例如我们在设计一个循环分支或一个函数,还不能确定业务逻辑,但又不能为空时,就可以用pass语句做占位符,准备留待将来实现。例如:
