前面几节课,我们写的 Python 语句都是一条一条按顺序执行的,这种代码结构叫做顺序结构。然而,在现实生活中,仅有顺序结构并不能解决所有的问题。本节课,我们将学习如何控制程序的流程,使得程序具有“判断能力”, 能够像人脑一样分析问题,从而解决更复杂的问题。
6.1 程序结构
在python编程中,有三种程序结构:顺序结构、分支结构(选择结构)、循环结构。
顺序结构:程序从头到尾一直执行下去,Python之所以被称为解释型编程语言,是因为在其执行程序时解释一行,执行一行。
选择结构:if-else 语句。
循环结构:while和 for 语句
6.2 分支结构(选择结构)
在 Python 中,构成分支结构最常用的是if、elif和else三个关键字。分支机构有三种结构:单分支结构、双分支结构、多分支结构。如下图:
6.2.1 单分支结构(if 语句结构)
6.2.2 双分支结构(if-else)
以“BMI计算器”为例,对身体质量指数分两个标准:凡是指数在 18.5 <= BMI < 24范围内属于身材达标,其余的全部属于身材不够标准。修改后的代码如下:
# BMI计算器(优化版)height = float(input('请输入您的身高(cm):'))weight = float(input('请输入您的体重(kg):'))bmi = weight / (height / 100) ** 2print('BMI=%.2f'%bmi)if 18.5 <= bmi < 24: print('您的身材达标!')else: print('你的身材不够标准哟!')
6.2.3 多分支结构(if-elif-else)
# BMI计算器(完整版)height = float(input('请输入您的身高(cm):'))weight = float(input('请输入您的体重(kg):'))bmi = weight / (height / 100) ** 2print('BMI=%.2f'%bmi)if bmi < 18.5: print('您的体重过轻!')elif bmi < 24: print('您的身材很棒!')elif bmi < 27: print('您的体重过重!')else: print('您已重度肥胖!')
6.3 使用match和case构造分支结构(新增)
Python 3.10及以后版本 中增加了一种新的构造分支结构的方式,通过使用match和case 关键字,我们可以轻松的构造出多分支结构。
示例代码:
# match 和 case 分支结构status_code = int(input('请输入响应状态码: '))match status_code: case 400 | 405: description = 'Invalid Request' case 401 | 403 | 404: description = 'Not Allowed' case 418: description = 'I am a teapot' case 429: description = 'Too many requests' case _: description = 'Unknown Status Code'print('状态码描述:', description)
运行结果:
请输入响应状态码: 403状态码描述: Not Allowed
说明:带有_的case语句在代码中起到通配符的作用,如果前面的分支都没有匹配上,代码就会来到case _。case _的是可选的,并非每种分支结构都要给出通配符选项。如果分支中出现了case _,它只能放在分支结构的最后面,如果它的后面还有其他的分支,那么这些分支将是不可达的。
6.3 分支结构的应用
案例1:分段函数求值
有如下所示的分段函数,要求输入x,计算出y。
# 分段函数求值x = float(input('x = '))if x > 1: y = 3 * x - 5elif x >= -1: y = x + 2else: y = 5 * x + 3print(f'{y = }')
根据实际开发的需要,分支结构是可以嵌套的,也就是说在分支结构的if、elif或else代码块中还可以再次引入分支结构(不推荐)。在“Python 之禅”中有这么一句话:“Flat is better than nested”。是因为代码嵌套的层次如果很多,会严重的影响代码的可读性。
案例2:百分制成绩转换成等级
要求:如果输入的成绩在90分以上(含90分),则输出A;输入的成绩在80分到90分之间(不含90分),则输出B;输入的成绩在70分到80分之间(不含80分),则输出C;输入的成绩在60分到70分之间(不含70分),则输出D;输入的成绩在60分以下,则输出E。
# 百分制成绩转换为等级制成绩score = float(input('请输入成绩: '))if score >= 90: grade = 'A'elif score >= 80: grade = 'B'elif score >= 70: grade = 'C'elif score >= 60: grade = 'D'else: grade = 'E'print(f'{grade = }')
案例3:计算三角形的周长和面积。
要求:输入三条边的长度,如果能构成三角形就计算周长和面积;否则给出“不能构成三角形”的提示。
# 计算三角形的周长和面积a = float(input('a = '))b = float(input('b = '))c = float(input('c = '))if a + b > c and a + c > b and b + c > a: perimeter = a + b + c print(f'周长: {perimeter}') s = perimeter / 2 area = (s * (s - a) * (s - b) * (s - c)) ** 0.5 print(f'面积: {area}')else: print('不能构成三角形')
总结
学会了 Python 中的分支结构和循环结构,我们就可以解决很多实际的问题了,本节课列举了多个案例分析,帮助大家更好的掌握了构造分支结构的方法,下一节课我们为大家介绍循环结构,学完这两次课你一定会发现,你能写出很多很有意思的代码,请记住多写多练是最好的学习方法!