流程控制对于任何一门编程语言来说都是至关重要的,它提供了控制程序如何执行的方法。如果没有流程控制语句,整个程序将按照线性顺序来执行,而不能根据用户的需求决定程序执行的顺序。
3.1 程序结构
计算机在解决某个具体问题时,主要有3种情形,分别是顺序执行所有的语句、选择执行部分语句和循环执行部分语句。程序设计中的3种基本结构为顺序结构、选择结构和循环结构。
3.2 选择语句
Python中选择语句主要有3种形式,分别为if语句、if…else语句和if…elif…else多分支语句。
说明:在其他语言中(如C、C++、Java等),选择语句还包括switch语句,也可以实现多重选择。但是在Python中没有switch语句,所以实现多重选择的功能时,只能使用if…elif…else语句或者if语句的嵌套。
3.2.1 最简单的if语句
Python中使用if保留字来组成选择语句,简单的语法格式如下:
if 表达式:
语句块
其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式。
说明:在Python中,当表达式的值为非零的数或者非空的字符串时,if语句也认为是条件成立(即为真值)。
说明:使用if语句时,如果只有一条语句,那么语句块可以直接写到冒号“:”的右侧,例如下面的代码:if a > b:max = a
但是,为了程序代码的可读性,建议不要这么做。常见错误:
(1)if语句后面未加冒号,例如下面的代码:
number = 5
if number == 5
print("number的值为5")
(2)使用if语句时,如果在符合条件时,需要执行多个语句,例如,程序的真正意图是当bmi的值小于18.5时,才输出bmi的值和提示信息“您的体重过轻~@_@~”,正确代码如下:
if bmi<18.5:
print("您的BMI指数为:"+str(bmi)) # 输出BMI指数
print("您的体重过轻 ~@_@~")
在上面的代码中,如果第二个输出语句没有缩进,代码如下:
if bmi<18.5:
print("您的BMI指数为:"+str(bmi)) # 输出BMI指数
print("您的体重过轻 ~@_@~")
在执行程序时,无论bmi的值是否小于18.5,都会输出“您的体重过轻 ~@_@~”。这显然与程序的本意是不符的,但程序并不会报告异常,因此这种bug很难发现。
3.2.2 if…else语句
语法格式如下:
if 表达式:
语句块1
else:
语句块2
使用if…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果满足条件,则执行if后面的语句块,否则,执行else后面的语句块,这种形式的选择语句相当于汉语里的关联词语“如果……否则……”。
技巧:if…else语句可以使用条件表达式进行简化,如下面的代码:
a = -9if a > 0:
b = aelse:
b = -aprint(b)
可以简写成:
a = -9
b = a if a>0 else -a
print(b)
上段代码主要实现求绝对值的功能,如果a > 0,就把a的值赋值给变量b,否则将-a赋值给变量b。使用条件表达式的好处是可以使代码简洁,并且有一个返回值。
注意:在使用else语句时,else一定不可以单独使用,它必须和保留字if一起使用。
程序中使用if…else语句时,如果出现if语句多于else语句的情况,那么该else语句将会根据缩进确定该else语句属于哪个if语句。如下面的代码:
a = -1
if a >= 0:
if a > 0:
print("a大于0")
else:
print("a等于0")
上面的语句将不输出任何提示信息,这是因为else语句属于第3行的if语句,所以当a小于0时,else语句将不执行。
3.2.3 if…elif…else语句
在开发程序时,如果遇到多选一的情况,则可以使用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则不需要判断;另外,elif和else都必须与if一起使用,不能单独使用。
多学两招:
使用if选择语句时,尽量遵循以下原则:
(1)当使用布尔类型的变量作为判断条件时,假设布尔型变量为flag,较为规范的格式如下:if flag: # 表示为真if not flag: # 表示为假
不符合规范的格式如下:if flag == True:if flag == False:
(2)使用“if 1 == a:”这样的书写格式可以防止错写成“if a = 1:”这种形式,从而避免逻辑上的错误。
3.2.4 if语句的嵌套
前面介绍了3种形式的if选择语句,这3种形式的选择语句之间都可以互相嵌套。
在最简单的if语句中嵌套if…else语句,形式如下:
if 表达式1:
if 表达式2:
语句块1
else:
语句块2
在if…else语句中嵌套if…else语句,形式如下:
if 表达式1:
if 表达式2:
语句块1
else:
语句块2
else:
if 表达式3:
语句块3
else:
语句块4说明:if选择语句可以有多种嵌套方式,开发程序时,可以根据自身需要选择合适的嵌套方式,但一定要严格控制好不同级别代码块的缩进量。
实例 判断是否为酒后驾车
通过使用嵌套的if语句实现根据输入的酒精含量值判断是否为酒后驾车的功能,代码如下:
print("\n为了您和他人的安全,严禁酒后开车!\n")
proof = int(input("请输入每100毫升血液的酒精含量:")) # 获取用户输入的酒精含量,并转换为整型
if proof <20: # 酒精含量小于20毫克,不构成饮酒行为
print("\n您还不构成饮酒行为,可以开车,但要注意安全!")
else: # 酒精含量大于或等于20毫克,已经构成饮酒驾车行为
if proof <80: # 酒精含量小于80毫克,达到饮酒驾驶标准
print("\n已经达到酒后驾驶标准,请不要开车!")
else: # 酒精含量大于或等于80毫克,已经达到醉酒驾驶标准
print("\n已经达到醉酒驾驶标准,千万不要开车!")
3.3 条件表达式
在程序开发时,经常会根据表达式的结果,有条件地进行赋值。例如,要返回两个数中较大的数,可以使用下面的if语句:
a = 10
b = 6if a>b:
r = aelse:
r = b
针对上面的代码,可以使用条件表达式进行简化,代码如下:
a = 10
b = 6
r = a if a > b else b
使用条件表达式时,先计算中间的条件(a>b),如果结果为True,返回if语句左边的值,否则返回else右边的值。例如上面表达式中r的值为10。说明:Python中提供的条件表达式,可以根据表达式的结果进行有条件的赋值。
3.4 循环语句
循环主要有两种类型:■ 重复一定次数的循环,称为计次循环,如for循环。■ 一直重复,直到条件不满足时才结束的循环,称为条件循环。只要条件为真,这种循环会一直持续下去,如while循环。说明:在其他语言中(例如,C、C++、Java等),条件循环还包括do…while循环。但是,在Python中没有do…while循环。
3.4.1 while循环
while循环是通过一个条件来控制是否要继续反复执行循环体中的语句。
语法如下:
while 条件表达式:
循环体说明:循环体是指一组被重复执行的语句。
当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。
注意:在使用while循环语句时,一定不要忘记添加将循环条件改变为False的代码,否则将产生死循环。
3.4.2 for循环
for循环是一个依次重复执行的循环。通常适用于枚举或遍历序列,以及迭代对象中的元素。
语法如下:
for 迭代变量 in 对象:
循环体
其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组被重复执行的语句。
1.进行数值循环
在使用for循环时,最基本的应用就是进行数值循环。例如,想要实现从1到100的累加,可以通过下面的代码实现:print("计算1+2+3+……+100的结果为:")
result = 0 # 保存累加结果的变量
for i in range(101):
result += i # 实现累加功能print(result) # 在循环结束时输出结果
在上面的代码中,使用了range()函数,该函数是Python内置的函数,用于生成一系列连续的整数,多用于for循环语句中。其语法格式如下:
range(start,end,step)
参数说明:
start:用于指定计数的起始值,可以省略,如果省略则从0开始。
end:用于指定计数的结束值(但不包括该值,如range(7),则得到的值为0~6,不包括7),不能省略。当range()函数中只有一个参数时,即表示指定计数的结束值。
step:用于指定步长,即两个数之间的间隔,可以省略,如果省略则表示步长为1。例如,range(1,7)将得到1、2、3、4、5、6。
注意:在使用range()函数时,如果只有一个参数,那么表示指定的是end;如果有两个参数,则表示指定的是start和end;如果3个参数都存在时,最后一个参数才表示步长。
多学两招:在Python 2.x中,如果想让print语句输出的内容在一行上显示,可以在后面加上逗号(例如:print i,)。但是在Python 3.x中,使用print()函数时,不能直接加逗号,需要加上“,end = '分隔符'”,并且该分隔符为一个空格,如果在连接输出时不需要用分隔符隔开,也可以不加分隔符。
说明:在Python 2.x中,除提供range()函数外,还提供了一个xrange()函数,用于解决range()函数会不经意间耗掉所有可用内存的问题,而在Python 3.x中已经更名为range()函数,并且删除了老式xrange()函数。
常见错误:for语句后面未加冒号。
3.4.3 循环嵌套
在Python中,for循环和while循环都可以进行循环嵌套。
例如,在while循环中套用while循环的格式如下:
while 条件表达式1:
while 条件表达式2:
循环体2
循环体1
在for循环中套用for循环的格式如下:
for 迭代变量1 in 对象1:
for 迭代变量2 in 对象2:
循环体2
循环体1
在while循环中套用for循环的格式如下:
while 条件表达式:
for 迭代变量 in 对象:
循环体2
循环体1
在for循环中套用while循环的格式如下:
for 迭代变量 in 对象:
while 条件表达式:
循环体2
循环体1
除了上面介绍的4种嵌套格式外,还可以实现更多层的嵌套,因为与上面的嵌套方法类似,这里就不再一一列出了。
实例 打印九九乘法表
使用嵌套的for循环打印九九乘法表,代码如下:
for i in range(1, 10): # 输出9行
for j in range(1, i + 1): # 输出与行数相等的列
print(str(j) + "×" + str(i) + "=" + str(i * j) + "\t", end=' ')
print('') # 换行代码注解:
本实例的代码使用了双层for循环(循环流程如图3.22所示),第一个循环可以看成是对乘法表行数的控制,同时也是每一个乘法公式的第二个因数;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是在第一个循环的基础上建立的。
3.5 跳转语句
当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圈。如果希望在中间离开循环,也就是for循环结束重复之前,或者while循环找到结束条件之前。有两种方法来做到:
使用continue语句直接跳到循环的下一次迭代。
使用break完全中止循环。
3.5.1 break语句
break语句可以终止当前的循环,包括while和for在内的所有控制语句。
break语句的语法比较简单,只需要在相应的while或for语句中加入即可。
说明:break语句一般会结合if语句进行搭配使用,表示在某种条件下,跳出循环。如果使用嵌套循环,break语句将跳出最内层的循环。
在while语句中使用break语句的形式如下:
while 条件表达式1:
执行代码
if 条件表达式2:
break
其中,条件表达式2用于判断何时调用break语句跳出循环。
在for语句中使用break语句的形式如下:
for 迭代变量 in 对象:
if 条件表达式:
break
其中,条件表达式用于判断何时调用break语句跳出循环。
3.5.2 continue语句
continue语句的作用没有break语句强大,它只能终止本次循环而提前进入到下一次循环中。
continue语句的语法比较简单,只需要在相应的while或for语句中加入即可。
说明:continue语句一般会与if语句搭配使用,表示在某种条件下,跳过当前循环的剩余语句,然后继续进行下一轮循环。如果使用嵌套循环,continue语句将只跳过最内层循环中的剩余语句。
在while语句中使用continue语句的形式如下:
while 条件表达式1:
执行代码
if 条件表达式2:
continue
其中,条件表达式2用于判断何时调用continue语句跳出循环。
在for语句中使用continue语句的形式如下:
for 迭代变量 in 对象:
if 条件表达式:
continue
其中,条件表达式用于判断何时调用continue语句跳出循环。
3.6 pass空语句
在Python中还有一个pass语句,表示空语句。它不做任何事情,一般起到占位作用。例如,在应用for循环输出1~10之间(不包括10)的偶数时,在不是偶数时,应用pass语句占个位置,方便以后对不是偶数的数进行处理。代码如下:for i in range(1,10):
ifi%2 == 0: # 判断是否为偶数 print(i,end = ' ')
else: # 不是偶数 pass # 占位符,不做任何事情
程序运行结果如下:
2 4 6 8
3.7 实战
1.模拟10086查询系统
print('10086查询功能')
print('1.查询当前余额')
print('2.查询对其剩余流量')
print('3.查询当前剩余通话')
print('4.退出查询系统')
while True:
qqq = int(input('请输入'))
if qqq == 1:
print('180yuan')
elif qqq == 2:
print('5g')
elif qqq == 3:
print('190')
elif qqq == 4:
print('tuichu')
break
3.8 小结
本章详细介绍了选择语句、循环语句、break语句、continue跳转语句及pass空语句的概念及用法。在程序中,语句是程序完成一次操作的基本单位,而流程控制
语句是用于控制语句的执行顺序的。