
2.6 流程控制语句
Python的流程控制语句分为条件语句和循环语句。条件语句是指if语句,循环语句是指for循环语句和while循环语句。本节将分别讲解这几种控制语句的使用方法。
2.6.1 if条件语句

1.简单的if语句
if语句允许仅当某些条件成立时才运行某个区块的语句(即运行if语句中缩进部分的语句),否则,这个区块中的语句会被忽略,然后执行区块后的语句。
Python在执行if语句时,会去检测if语句中的条件是真还是假。如果条件为真,则执行冒号下面缩进部分的语句;如果条件为假,则忽略缩进部分的语句,执行下一行未缩进的语句。
案例6:判断是否能坐过山车
如下所示为用于判断是否能坐过山车的简单if语句。

上述语句第一条语句的含义:新建一个变量“age”,然后在屏幕上打印“请输入您的年龄:”等待用户输入,当用户输入后,将用户输入的内容转换为整型,赋给变量“age”。语句中“age”为新定义的变量;int()函数用来将字符串或数字定义为整数;input()为输入函数,将用户输入的内容赋给变量“age”。
第二和三条语句为if语句。它包括if、冒号(:)及下面的缩进部分的语句。其中if与冒号之间的部分为条件(即age>=16为条件)。程序执行时,Python会去判断条件为真还是假;如果条件为真(即条件成立),则接着执行下面缩进部分的语句;如果条件为假(即不成立),则忽略缩进部分的语句。
上述代码运行结果如下(输入18)。

上述if语句是如何执行的呢?
1)首先在屏幕上打印“请输入您的年龄:”,然后等待。
2)当用户输入“18”后,将“18”转换为整型,然后赋给变量“age”,这时变量的值为18。
3)接着执行if语句,先检测“age>=16”是真是假。由于18>16,因此条件为真。Python开始执行下一行缩进部分的语句,打印输出“您可以坐过山车了”,结束程序。
如果用户输入的是“15”,程序会输出什么结果呢?运行程序,用户输入“15”后,由于条件语句的条件不成立,因此直接忽略if语句中缩进部分的语句,执行下面未缩进部分的语句。
2.if-else语句
人们常常想让程序这样执行:如果一个条件为真(True),做一件事;如果条件为假(False),做另一件事情。对于这样的情况,可以使用if-else语句。if-else语句与前面讲的if语句类似,但其中的else语句让你能够指定条件为假时,要执行的语句。即如果if语句条件判断是真(True),就执行下一行缩进部分的语句,同时忽略后面的else部分语句;如果if语句条件判断是假(False),忽略下一行缩进部分的语句,去执行else语句及else下一行缩进部分的语句。
案例7:判断是否能坐过山车(改进版)
如下所示为用if-else语句判断是否能坐过山车。

第01行代码作用是新建一个变量“age”,并将用户输入的值赋给变量“age”。
第02~05行代码为if-else语句。程序执行时,Python会去判断if语句中的条件(即age>=16)为真还是假;如果条件为真(即条件成立),则接着执行下一行缩进部分的语句,并忽略else语句及else下面的缩进部分语句;如果条件为假(即不成立),则忽略下一行缩进部分的语句,执行else语句及else下一行缩进部分的语句。
上述代码运行结果如下(输入15)。

上述代码运行结果如下(输入19)。

上述if-else程序是如何执行的呢?
1)首先在屏幕上打印“请输入您的年龄:”,然后等待。
2)当用户输入“15”后,将“15”转换为整型,然后赋给变量“age”,这时变量的值为15。
3)执行if语句,先检测“age>=16”是真是假。由于15<16,因此条件为假。Python忽略下一行缩进部分的语句,执行else语句。
4)执行else语句下一行缩进部分的语句,打印输出“您太小了,还不能坐过山车”,结束程序。
5)再次运行程序,在屏幕上打印“请输入您的年龄:”,然后等待。
6)当用户输入“19”后,将“19”转换为整型,然后赋给变量“age”,这时变量的值为19。
7)执行if语句,先检测“age>=16”是真是假。由于19>16,因此条件为真。Python开始执行下一行缩进部分的语句,打印输出“您可以坐过山车了”。
8)忽略else语句及else下面缩进部分的语句,结束程序。
3.if-elif-else语句
在编写程序时,如果需要检查超过两个条件的情况时,可以使用if-elif-else语句。在使用if-elif-else语句时,会先判断if语句中条件的真假;如果条件为真就执行if语句下一行缩进部分的语句;如果条件为假,则忽略if语句下一行缩进部分的语句,去执行elif语句。接着会判断elif语句中的条件真假,如果条件为真,就执行elif语句下一行缩进部分的语句;如果条件为假,则忽略elif语句下一行缩进部分的语句,去执行else语句及下一行缩进部分的语句。
案例8:哪些人能走老年通道
如下所示为用if-elif-else语句判断是否能走老年通道。

第01行代码作用是新建一个变量“age”,并将用户输入的值赋给变量“age”。
第02~09行代码作用是为if-elif-else语句。程序执行时,Python会按照先后顺序进行判断,若当前条件(if的条件或者是elif的条件)为真时,执行对应缩进部分的代码,并且后面还未执行的条件判断都跳过,不再执行了。若当前条件为假,则跳到下一个条件进行判断。
上述代码运行结果如下(输入61)。

上述代码运行结果如下(输入12)。

上述if-elif-else程序是如何执行的呢?
1)首先在屏幕上打印“请输入您的年龄:”,然后等待。
2)当用户输入“61”后,将“61”转换为整型,然后赋给变量“age”,这时变量的值为61。
3)执行if语句,先检测“age>=60”是真是假。由于61>60,因此条件为真。Python开始执行下一行缩进部分的语句,打印输出“请您走老年人通道”。
4)忽略所有elif语句及else语句,结束程序。
5)再次运行程序,在屏幕上打印“请输入您的年龄:”,然后等待。
6)当用户输入“12”后,将“12”转换为整型,然后赋给变量“age”,这时变量的值为12。
7)执行if语句,先检测“age>=60”是真是假。由于12<60,因此条件为假。Python忽略下一行缩进部分的语句,然后执行第一个elif语句。
8)检测“60>age>=18”是真是假。由于12<18,因此条件为假。Python忽略下一行缩进部分的语句,然后执行第二个elif语句。
9)检测“18>age>=7”是真是假。由于18>12>7,因此条件为真。Python开始执行下一行缩进部分的语句,打印输出“请您走青少年通道”,并忽略else语句,结束程序。
注意:
if-elif语句中只要有一个if语句的条件成立,就会跳过检测其他的elif语句。因此只适合只有一个选项的情况。
4.if语句的嵌套
前面介绍了3种形式的if条件语句,这3种形式的条件语句之间都可以相互嵌套。在最简单的if语句中嵌套if-else语句,形式如下。

在if-else语句中嵌套if-else语句,形式如下。

2.6.2 for循环

1.for循环
for循环简单来说是使用一个变量来遍历列表中的每一个元素,就好比让一个小朋友依次走过列表中的元素一样。
for循环可以遍历任何序列的项目,如一个列表或者一个字符串。它常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素,并存储在变量中。
在使用for循环遍历列表和元组时,列表或元组有几个元素,for循环的循环体就执行几次,针对每个元素执行一次,迭代变量会依次被赋值为元素的值。
for循环中包括for...in和冒号(:),其用法如下所示。

上述代码中,names为一个列表(列表的相关知识参考下一节内容),第二、三行代码为一个for循环语句,name为一个新建的变量,开始循环时,从列表names中取出一个元素,并存储在变量name中,然后print语句将元素打印出来。接着第二次循环,再从列表names中取出第二个元素,存储在变量name中,并打印出来;这样一直重复执行,直到列表中的元素全部被打印出来。
代码运行结果如下所示。

注意:
上述代码中的冒号(:)不能丢。另外,“print(name)”语句必须缩进4个字节才会参与循环。如果忘记缩进,运行程序时,将会出错,Python将会提醒用户缩进。
2.for循环的好搭档——range()函数
range()函数是Python内置的函数,用于生成一系列连续的整数,多与for循环配合使用。如下所示为range()函数的用法。

上述代码中,range(1,6)函数参数中的第一个数字1为起始数,第二个数字为结束数,但不包括此数。因此就生成了从1到5的数字。
代码运行结果如下。

如下所示为修改range()函数参数后的程序。

上述代码中,range(1,6,2)函数参数中的第一个数字1为起始数,第二个数字为结束数(不包括此数),第三个数为步长,即两个数之间的间隔。因此就生成了1,3,5的奇数。
代码运行结果如下。

如下所示为range()函数只有一个参数的程序。

上述代码中,range(10)函数参数中,如果只有一个数,表示指定的是结束数,第一个数默认从0开始。因此就生成了0到9的数字。
3.遍历字符串
使用for循环除了可以循环数值、列表外,还可以逐个遍历字符串,如下所示为for循环遍历字符串。

上述代码运行后结果如下所示。

案例9:用for循环画螺旋线
在IDLE中创建一个名为“螺旋线.py”的文件,然后在文件中导入turtle模块,接着用for循环遍历range生成的整数列表,在每次循环时,让画笔画线段并旋转画笔,即可实现画螺旋线。代码如下。

运行结果如下。

2.6.3 while循环

for循环主要针对集合中的每个元素(即遍历)。接下来要讲的while循环则是只要指定的条件满足,就不断地循环,直到指定的条件不满足为止。
while循环中包括while、条件表达式和冒号(:)。条件表达式是循环执行的条件,每次循环执行前,都要执行条件表达式,对条件进行判断。如果条件成立(即条件为真时)就执行循环体(循环体为冒号后面缩进的语句),否则退出循环;如果条件表达式在循环开始时就不成立(即条件为假),则不执行循环语句,直接退出循环。
while循环的用法如下所示。

第1行代码中的n为新建的变量,并将1赋给n。第2~4行代码为while循环语句,语句中“while”与“:”(冒号)之间的部分为循环中的条件表达式(即这里的“n<10”为条件表达式)。当程序执行时,Python会不断地判断while循环中的条件表达式是否成立(即是否为真)。如果条件表达式成立,就会执行下面缩进部分的代码(即打印n,然后将n加1)。之后又重复以上执行while循环,重新判断条件表达式是否成立。就这样一直循环,直到条件表达式不成立时,停止循环,开始执行while循环下面的代码“print('结束')”代码。
注意:
while及下面缩进部分语句都为while循环的组成部分。注意:别丢掉冒号(:)。
代码运行结果如下。

上面程序是如何执行的呢?
首先Python新建一个变量n,并将1赋给n,接着执行while循环。
第1次循环:先判断条件表达式n<10是否成立。由于1<10,条件表达式成立,因此执行冒号下面缩进部分的代码。先执行print(n)语句,打印输出1,再执行n=n+1(即n=1+1),这时n的值就变成了2。
第2次循环:接下来重复执行while循环,判断条件表达式n<10是否成立。由于2<10,条件表达式成立,接着执行循环体中缩进部分的代码。先执行print(n)语句,打印输出2,再执行n=n+1(即n=2+1),这时n的值就变成了3。
第10次循环:就这样一直循环,直到第10次循环时,这时n的值为10,条件表达式变成了10<10,条件表达式不成立了。这时Python停止执行循环部分的代码,开始执行下面的代码,即执行“print('结束')”代码,打印输出“结束”。程序运行结束。
提示:如果while循环中的条件表达式是“True”(第一个字母必须大写),那么while循环将会一直循环。
案例10:输入登录密码
在IDLE中创建一个名为“输密码.py”的文件,然后在文件中定义两个变量,并赋值0和True,然后用while循环让用户循环输入密码,直到输入正确的密码结束输入,代码如下。

运行结果如下。

2.6.4 break语句
如果想从while循环或for循环中,立即退出,不再运行循环中余下的代码,也不管条件表达式是否成立,可以使用break语句。break语句用于控制程序的流程,可使用它来控制哪些代码将执行,哪些代码不执行,从而让Python执行想要执行的代码。
break语句的用法如下所示。

代码中while及下面缩进部分语句都为while循环语句。while循环中嵌套了if条件语句。这两句为if条件语句,来检测n是否大于5,如果n大于5就执行break语句,退出循环。
代码运行结果如下。

上面程序是如何执行的呢?首先Python新建一个变量n,并将1赋给n,接着执行while循环。
第1次循环:先判断条件表达式n<10是否成立。由于1<10,条件表达式成立,因此执行冒号下面缩进部分的代码。先执行“if n>5”语句,判断n>5是真还是假,由于“1>5”不成立,因此if条件测试的值为假,Python程序会忽略if语句中缩进部分的语句(即忽略break语句)。接着执行print(n)语句,打印输出1,再执行n=n+1(即n=1+1),这时n的值就变成了2。
第2次循环:接下来重复执行while循环,判断条件表达式n<10是否成立。由于2<10,条件表达式成立,接着执行循环体中缩进部分的代码。先执行“if n>5”语句,由于“2>5”不成立,因此if条件测试的值为假,Python程序会忽略break语句。接着执行print(n)语句,打印输出2,再执行n=n+1(即n=2+1),这时n的值就变成了3。
第6次循环:就这样一直循环,直到第6次循环时,n的值为6,while循环中的条件表达式变成了6<10,条件表达式成立。接着执行循环体中“if n>5”语句,由于“6>5”成立,因此if条件测试的值为真,之后Python程序执行break语句,退出while循环。执行下面的代码,即执行“print('结束')”代码,打印输出“结束”。程序运行结束。
注意:
在任何Python循环中都可以使用break语句来退出循环。
案例11:输入登录密码(break版)
在IDLE中创建一个名为“输密码.py”的文件,然后在文件中定义两个变量,并赋值0和True,然后用while循环让用户循环输入密码,直到输入正确的密码结束输入,代码如下。

运行结果如下。

2.6.5 continue语句
在循环过程中,也可以通过continue语句跳过当前的这次循环,直接开始下一次循环。即continue语句可以返回到循环开头,重新执行循环,进行条件测试。
continue语句的使用方法如下所示。

代码中while及下面缩进部分语句都为while循环语句。循环中嵌套了if条件语句。这两句为if条件语句,来检测n除以2的余数是否等于0(即判断是否为偶数)如果求余的结果等于0,就执行continue语句,跳到while循环开头,开始下一次循环。
代码运行结果如下。

上面程序是如何执行的呢?首先Python新建一个变量n,并将0赋给n,接着执行while循环。
第1次循环:先判断条件表达式n<10是否成立。由于0<10,条件表达式成立,因此执行冒号下面缩进部分的代码。先执行“n=n+1”语句,n就变成了1;接着执行“if n%2==0”语句,判断n除以2的余数是否等于0(即判断n是否为偶数)。由于这时n的值变成了1,而1除以2的余数为1,if条件测试的值为假,Python程序会忽略if语句中缩进部分的语句(即忽略continue语句),接着执行print(n)语句,打印输出1。
第2次循环:接下来重复执行while循环,判断条件表达式n<10是否成立。由于1<10,条件表达式成立,接着执行循环体中缩进部分的代码。先执行“n=n+1”语句,n的值为1+1=2;接着执行“if n%2==0”语句,判断n除以2的余数是否等于0。由于2除以2的余数为0,if条件测试的值为真,Python程序执行continue语句,返回到while循环开头,重新开始循环。
第3次循环:判断条件表达式n<10是否成立。由于2<10,条件表达式成立,因此执行冒号下面缩进部分的代码。先执行“n=n+1”语句,n的值为2+1=3;接着执行“if n%2==0”语句,判断n除以2的余数是否等于0。由于3除以2的余数为1,if条件测试的值为假,Python程序会忽略if语句中缩进部分的语句(即忽略continue语句)。接着执行print(n)语句,打印输出3。
第11次循环:就这样一直循环,直到第11次循环时,n的值为10,条件表达式变成了10<10,条件表达式不成立了。这时Python停止执行循环部分的代码,程序运行结束。
案例12:10086查询系统
在IDLE中创建一个名为“10086查询.py”的文件,然后在文件中定义none变量,并赋值True,然后用while循环实现无限循环,让用户输入要查询的代码,之后判断用户输入的代码,并输出相应的值,代码如下。

运行结果如下。
