
3.2 三大结构
Python语言中有三大程序结构,分别是顺序结构、条件分支结构和循环结构。一个复杂的程序中,常常同时包含这3种结构。
3.2.1 顺序结构
顺序结构就是按程序内语句的排列顺序运行程序的一种结构。我们之前所举的例子都是顺序结构的。这也是Python中最简单的结构。顺序结构的执行过程如图3.18所示。示例代码如下:

在这段程序中,先执行第1行赋值语句,再执行第二条赋值语句,然后执行第3行input输入语句,最后执行print输出语句。从描述上看,排在前面的语句先执行,依次按顺序执行,这就是一个顺序结构的程序。
3.2.2 条件分支结构
在Python中,条件分支语句包括简单if语句、if…else语句以及if…elif…else语句3种形式。其基本道理都一样,根据一条或者多条语句的判定结果(True和False)来执行对应操作的语句,从而实现“分支”的效果。接下来分别介绍这几种分支结构形式。
1.简单if语句
Python中使用if关键字来组成选择语句。简单if语句的逻辑关系相当于汉语里的“如果……就……”,语法格式如下:
if 表达式: 语句块
其中,表达式可以是一个单纯的布尔值或变量,也可以是一个比较表达式或逻辑表达式(如a > b and a != c)。如果表达式的值为真,则执行其后的语句块;如果表达式的值为假,就跳过该语句块,继续执行后面的语句。流程图如图3.19所示。

图3.18 顺序结构流程图

图3.19 简单if语句的流程图
【实例3.7】 使用简单if语句判断成绩是否及格。(实例位置:资源包\Code\03\07)
使用简单if语句判断语文考试成绩是否合格通过。如果成绩大于等于60分,表示通过考试;如果成绩小于60分,表示没有通过考试。具体代码如下:

当输入数字45和98时,程序运行结果如图3.20和图3.21所示。

图3.20 没有通过考试

图3.21 通过考试
2.if…else语句
if…else语句的逻辑关系相当于汉语里的“如果……否则……”,其语法格式如下:
if 表达式: 语句块1 else: 语句块2
其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式。如果表达式结果为真,执行if后的语句块1;如果表达式结果为假,跳过if后语句,执行else后的语句块2。流程图如图3.22所示。
【实例3.8】 使用if…else语句判断成绩是否及格。(实例位置:资源包\Code\03\08)
将例3.7改为使用if…else语句实现,具体代码如下:

当输入数字55和95时,程序运行结果如图3.23和图3.24所示。

图3.22 if…else语句的流程图

图3.23 成绩不超过60

图3.24 成绩超过60
3.if…elif…else语句
if…elif…else语句是一个多分支选择语句,其逻辑关系为“如果满足某种条件,执行某种处理;否则,如果满足另一种条件,执行另一种处理……”。语法格式如下:
if 表达式1: 语句块1 elif 表达式2: 语句块2 elif 表达式3: 语句块3 … else: 语句块n
使用if…elif…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式。如果表达式1的值为真,执行语句块1;如果表达式1的值为假,则跳过语句块1,进行下一个elif的判断;只有在所有表达式都为假的情况下,才会执行else中的语句n。流程如图3.25所示。

图3.25 if…elif…else语句的流程图
【实例3.9】 判断成绩等级。(实例位置:资源包\Code\03\09)
一个考生,如果其分数为90~100分,等级为优秀;分数为70~89分,等级为良好;分数为60~69分,等级为及格;否则,就是不及格。代码如下:

当输入数字48、89和96时,程序运行结果如图3.26~图3.28所示。

图3.26 不及格

图3.27 良好

图3.28 优秀
4.if语句的嵌套
前面介绍了3种形式的if选择语句,它们之间可以互相嵌套。例如,在简单if语句中嵌套if…else语句,形式如下:

在if…else语句中嵌套if…else语句,形式如下:

说明
if语句嵌套方式灵活,开发时一定要严格控制好不同级别代码块的缩进量。
【实例3.10】 模拟人生的不同阶段。(实例位置:资源包\Code\03\10)
设置一个变量age的值,编写if嵌套结构,根据age值判断处于人生哪个阶段。
如果年龄为0~13(含13)岁,就打印消息“您是儿童”。
如果年龄为13~20(不含13,含20)岁,就打印消息“您是青少年”。
如果年龄为20~65(不含20,含65)岁,就打印消息“您是成年人”。
如果年龄为65岁以上,就打印消息“您是老年人”。
具体代码如下:

当输入数字16和45时,程序运行结果如图3.29和图3.30所示。

图3.29 青少年

图3.30 成年人
3.2.3 循环结构
循环结构是可以多次执行同一段代码的语句结构。在Python中有两种循环语句,即while语句和for语句。接下来详细讲解这两种循环语句。
1.while语句
while循环中,通过一个条件来控制是否要反复执行循环体中的语句。语法格式如下:
while 条件表达式: 循环体
说明
循环体是指一组需要被重复执行的语句。
当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while循环语句的执行流程如图3.31所示。
【实例3.11】 计算1*2*3*4*5的值。(实例位置:资源包\Code\03\11)
具体代码如下:

最终运行的结果如图3.32所示。

图3.31 while语句的执行流程图

图3.32 while语句运行结果
这段代码的执行过程如下:
(1)循环检验条件为i<=5,当i=1时,结果为真,执行循环体内容,即sum1=sum1*i=1*1=1,i+=1之后,i=2。
(2)再次进行i<=5检测,结果为真,执行循环体内容,即sum=sum*i=1*2=2,i+=1之后,i=3。
(3)如此循环多次,到i=6时,再次进行i<=5进行检测,结果为假,不再执行循环体内容,跳出循环,执行print语句,输出最后的sum1值。
2.for语句
for循环是一个依次重复执行的循环,通常适用于枚举、遍历序列以及迭代对象中的元素。语法格式如下:
for 迭代变量 in 对象: 循环体
其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组需要重复执行的语句。
for循环语句的执行流程如图3.33所示。
【实例3.12】 打印5个“*”。(实例位置:资源包\Code\03\12)
用for循环打印5个“*”,具体代码如下:
01 i=0 #初始化变量 02 for i in range(0,5): #从0~5遍历i 03 print("*") #每遍历一次,输出一个“*”
运行结果如图3.34所示。

图3.33 for循环语句流程图

图3.34 for循环运行结果
上面的代码中使用了range()函数,该函数是Python的内置函数,用于生成一系列连续的整数,多用于for循环语句中。其语法格式如下:
range(start,end,step)
参数说明:
start:用于指定计数的起始值,可以省略。如果省略,则从0开始计数。
end:用于指定计数的结束值(但不包括该值,如range(7)得到的值为0~6,不包括7),不能省略。当range()函数中只有一个参数时,表示指定计数的结束值。
step:用于指定步长,即两个数之间的间隔,可以省略。如果省略,则表示步长为1。例如,rang(1,7)将得到1、2、3、4、5、6。
注意
使用range()函数时,如果只有一个参数,表示指定的是end;如果有两个参数,表示指定的是start和end;如果3个参数都存在,最后一个参数表示步长。
3.循环的嵌套
在Python中,for循环和while循环间可以相互嵌套。例如,在while循环中套用while循环的格式如下:

在for循环中套用for循环的格式如下:

在while循环中套用for循环的格式如下:

在for循环中套用while循环的格式如下:

除了上面介绍的4种嵌套格式外,还可以实现更多层的嵌套,这里不再一一列出。
【实例3.13】 打印九九乘法表。(实例位置:资源包\Code\03\13)
使用嵌套的for循环打印九九乘法表,具体代码如下:

运行结果如图3.35所示。

图3.35 九九乘法表
本实例的代码使用了双层for循环,第一个循环可以看成是对乘法表行数的控制,同时也是每一个乘法公式的第二个因数;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是在第一个循环的基础上建立的。
4.跳转语句(break、continue语句)
当循环条件满足时,程序会一直执行下去。如果希望程序在for循环结束重复前或while循环找到结束条件前就离开循环,有两种方法:使用break语句,完全中止循环;或者使用continue语句,直接跳到循环的下一次迭代中。下面来详细讲解。
1)break语句
break语句可以终止当前的循环,一般与if语句搭配使用,表示在某种条件下跳出循环。如果break语句应用在嵌套循环中,则可跳出最内层的循环。
在while语句中使用break语句的形式如下(条件表达式2用于判断何时调用break语句跳出循环):

在for语句中使用break语句的形式如下(条件表达式用于判断何时调用break语句跳出循环):

在while语句中使用break语句的流程如图3.36所示。在for语句中使用break语句的流程如图3.37所示。

图3.36 while语句中使用break语句

图3.37 for语句中使用break语句
【实例3.14】 给披萨加配料(break版)。(实例位置:资源包\Code\03\14)
编写程序,提示用户输入披萨配料。当用户输入quit时,结束循环。每当用户输入一个配料,就打印出添加配料的情况。具体代码如下:

运行结果如图3.38所示。当用户输入quit时,跳出循环并结束程序,这就是break语句的作用。

图3.38 break语句应用
2)continue语句
continue语句的作用没有break语句强大,它只能终止本次循环,提前进入下一次循环。continue语句的语法比较简单,只需要在相应的while或for语句中加入即可。
说明
continue语句一般会搭配if语句使用,表示在某种条件下跳过当前循环的剩余语句,继续进行下一轮循环。如果使用嵌套循环,continue语句将只跳过最内层循环中的剩余语句。
在while语句中使用continue语句的形式如下(条件表达式2用于判断何时调用continue语句):

在for语句中使用continue语句的形式如下(条件表达式用于判断何时调用continue语句):

在while语句中使用continue语句的流程如图3.39所示。在for语句中使用continue语句的流程如图3.40所示。

图3.39 while语句中使用continue语句

图3.40 for语句中使用continue语句
【实例3.15】 给披萨加配料(continue版)。(实例位置:资源包\Code\03\15)
在实例3.14的基础上,将代码中的break换成continue。具体代码如下:

运行结果如图3.41所示。

图3.41 coutinue语句
从运行结果来看,当输入quit时,程序并没有结束循环,只是跳过当前循环,继续执行下一次循环,这就是continue语句的作用。