第5章〓程序结构: 选择执行 条件选择语句是判断某个条件是否成立,然后选择执行程序中的某些语句块。与顺序结构比较,选择语句使程序不再完全按照语句的先后顺序执行,而是根据某种条件是否成立来决定执行的路径,它体现了程序具有逻辑判断的基本智能。 5.1选择——条件执行语句 1. 单条件选择结构语法 单条件选择语句的语法如下: 1if条件表达式:# 条件表达式只允许用关系运算符"==";不允许用赋值运算符"=" 2语句块# 如果条件表达式为True,则执行语句块,执行完后结束if语句 2. 双条件选择结构语法 双条件选择语句结构如图51所示,双条件选择语句的语法如下: 1if条件表达式:# 条件表达式只允许用关系运算符"==";不允许用赋值运算符"=" 2语句块1# 如果条件表达式为True,则执行语句块1,执行完后结束if语句 3else:# 否则 4语句块2# 如果条件表达式为False,则执行语句块2,执行完后结束if语句 图51双条件选择语句结构 在if语句中,保留字if可以理解为“如果”; 条件表达式往往采用关系表达式(如x>=60),条件表达式的值只能是True(T)或者False(F); 语句结尾的冒号(:)可以理解为“则”; 保留字else可以理解为“否则”。 注意: if语句的冒号(:)不可省略,if语句块可以有多行,但是if语句块内部必须缩进4个空格,并且保持垂直对齐。 3. 条件选择语句执行方法 (1) 无论条件表达式的值为真(True)还是假(False),一次只能执行一个分支的语句块。简单地说,程序不能同时执行语句块1和语句块2。 (2) 无论执行哪一个语句块,都必须能脱离选择结构。 【例51】双条件选择语句说明如图52所示。 图52双条件选择语句说明 案例分析: Python根据条件表达式的值为True还是False,来决定怎样执行if语句中的代码。如果条件表达式的值为True,Python就执行if后的语句块1; 如果条件表达式的值为False,Python将忽略语句块1,选择执行else后的语句块2。程序如下: 1x = 80# 变量赋值 2if x >= 60:# 如果条件表达式x>= 60为真,则执行语句3 3print('成绩及格')# 执行完本语句后,结束if语句(不执行语句4~5) 4else:# 否则,执行语句5(x>= 60为假时,跳过语句3) 5print('成绩不及格')# 执行完本语句后,结束if语句 >>> 成绩及格# 程序输出 双条件选择程序结构适用于二选一的应用场景,两个语句块中总有一个语句块会被执行。如果有多种选择的要求,应当采用多条件选择语句结构。 4. 多条件选择结构语法 当条件选择有多个项目时,可以使用多条件选择语句ifelif。语句elif是else if的缩写,语句结构如图53和图54所示,多条件选择的语法如下: 1if条件表达式1:# 判断条件1 2语句块1# 条件1为True,则执行语句块1,执行完后结束if-elif语句 3elif条件表达式2:# 条件1不满足时,继续判断条件2 4语句块2# 条件2为True,则执行语句块2,执行完后结束if-elif语句 5elif条件表达式3:# 条件2也不满足时,继续判断条件3 6语句块3# 条件3为True,则执行语句块3,执行完后结束if-elif语句 7else:# 条件1、2、3都不满足时(注意,此处没有条件表达式) 8语句块4# 执行语句块4,执行完后结束if-elif语句 5. 条件选择语句注意问题 (1) if、elif都需要写条件表达式,但是else不需要写条件表达式。 (2) else、elif需要与if一起使用。 (3) if、elif、else行尾都有英文冒号(:)。 (4) 选择语句if从上往下判断,当表达式为True时,将该条件选择对应的语句块执行完后,忽略掉剩下的elif和else语句块,结束if语句,即一次只执行一个分支。 图53多条件选择语句结构 图54多条件选择语句案例 (5) 多条件语句要多注意条件之间的包含关系,以及变量取值的变化范围。 【例52】用多条件选择语句实现“石头—剪刀—布”游戏,程序如下: 1import random# 导入标准模块 2 3player = int(input('【1=石头,2=剪刀,3=布】请出拳:'))# 玩家输入1~3的整数 4computer = random.randint(1, 3)# 程序生成1~3的随机数 5if ((player == 1 and computer == 2) or# 如果玩家为1,程序为2 6(player == 2 and computer == 3) or# 或者玩家为2,程序为3 7(player == 3 and computer == 1)):# 或者玩家为3,程序为1 8print('你赢了,好厉害啊!')# 打印玩家胜利 9elif player == computer:# 否则,玩家与程序相同时 10print('欧耶!平局,再来一盘!')# 打印平局 11else:# 否则 12print('哦豁,你输了,还玩吗?')# 打印玩家输 >>> 【1=石头,2=剪刀,3=布】请出拳:1# 程序输出 你赢了,好厉害啊! 注意: 函数input()返回值为字符串,需要用int()函数将其转换为整数。 5.2选择——三元条件选择 1. 三元条件选择语法 三元运算是有3个操作数(左值、条件表达式值、右值)的程序语句。在简单条件判断程序中,经常采用三元运算进行条件赋值,三元条件选择语法如下: 1 a =左值 if 条件表达式 else 右值 如图55所示,三元条件选择语句中,首先进行条件判断,条件表达式的值为真(True)时,将左值赋给变量; 条件表达式的值为假(False)时,将右值赋给变量。 图55双条件选择与三元条件选择语句的比较 三元条件选择是单行语句,不是语句块; 且语句行尾没有冒号,下一行语句无须缩进。 2. 三元条件选择程序设计 三元条件选择语句可以将双条件选择语句简化为一行,这方便了某些特殊应用。 【例53】双条件选择语句。 1x=520; y=1314 2if x < y: 3small = x 4else: 5small = y 6print('值小的数是:', small) >>> 值小的数是: 520 【例54】三元条件选择语句。 1x=520; y=1314 2small = x if x < y else y 3print('值小的数是:', small) >>> 值小的数是: 520 【例55】用三元条件选择判断奇数和偶数,程序如下: 1num = int(input('请输入一个整数:')) 2result = '偶数' if num % 2 == 0 else '奇数'# 用三元运算判断奇数和偶数 3print('您输入的是:', result) >>> 请输入一个整数:28# 程序输出 您输入的是: 偶数 案例4: 双条件选择——一元二次方程求根 1. 一元二次方程求根方法 一元二次方程求根的方法很多,最常用的是公式法。一元二次方程都可以化为ax2+bx+c=0(a≠0)的形式,其中x2是二次项,a是二次项系数; bx是一次项,b是一次项系数; c是常数项。它的求根公式如下: x=-b±b2-4ac2a(51) 其中b2-4ac称为一元二次方程根的判别式,用符号Δ表示。当Δ<0时,方程没有实数根(实数范围内无解); 当Δ=0时,方程有两个相等的实数根,它们是x=-b/(2a); 当Δ>0时,方程有两个不等的实数根,这时只要把方程的三个系数代入公式(51)计算即可。 2. 程序设计: 用公式法求解一元二次方程 【例56】对方程44x2+123x-54=0求根。 案例分析: 对一元二次方程编程求根时,需要考虑以下问题。 (1) 代数式求解需要将代数式转换成程序规定的算术表达式,转换方法可以参考表23。 (2) 方程求根需要对有无实数根进行判断,因此需要用到if条件选择语句。 (3) 解一元二次方程需要进行开方运算,因此需要导入math数学模块。 案例实现程序如下: 1import math# 导入标准模块 2 3print('请输入方程a*x**2+b*x+c=0的系数:')# 打印提示信息 4a = float(input('二次项系数a = '))# 将输入字符串转换为浮点数 5b = float(input('一次项系数b = ')) 6c = float(input('常数项c = ')) 7delta = b*b-4*a*c# 计算方程判别式delta 8if delta <0:# 如果判别式delta小于0 9print('方程无解')# 打印输出信息 10exit()# 函数exit()为退出程序 11else:# 否则 12root1 = (-b+math.sqrt(delta))/(2*a)# 计算方程根1 13root2 = (-b-math.sqrt(delta))/(2*a)# 计算方程根2 14print(f'x1={root1:.2f}x2={root2:.2f}')# “f”为格式化输出,“:.2f”为保留2位 # 小数 >>> 请输入方程a*x**2+b*x+c=0的系数:# 程序输出 二次项系数a = 44 一次项系数b = 123 常数项c = -54 x1=0.39x2=-3.18 程序第14行,打印语句中,参数f为格式化,花括号“{ }”中root为变量名,冒号为分隔符,参数“.2f”为保留2位小数。具体语法参见4.4节。 3. 程序设计: 用符号计算求解一元二次方程 【例57】用符号计算对一元二次方程ax2+bx-c=0求根,程序如下: 1import sympy# 导入第三方包 2 3print('请输入方程a*x**2+b*x+c=0的系数:') 4a = float(input('输入二次项系数a = '))# 输入方程系数 5b = float(input('输入一次项系数b = ')) 6c = float(input('输入常数项c = ')) 7x = sympy.symbols('x')# 定义符号x 8equation = sympy.Eq(a*x**2 + b*x + c, 0)# 构造方程 9root = sympy.solve(equation, x)# 求解方程 10print(f'x1= {root[0]};x2= {root[1]}')# 打印结果 >>> 请输入方程a*x**2+b*x+c=0的系数:# 程序输出 输入二次项系数a = 44 输入一次项系数b = 123 输入常数项c = -54 x1= -3.18123904902659;x2= 0.385784503572045 4. 程序设计: 判断闰年 【例58】输入一个年份数,判断它是否为闰年,程序如下: 1year = int(input('请输入年份【如2023】:')) 2ifyear % 400 == 0 or year % 4 == 0 and year % 100 != 0:# 符号%为模运算 3print('闰年') 4else: 5print('平年') >>> 请输入年份【如2023】:2000# 程序输出 闰年 程序单词: delta(德尔塔,Δ),Eq(等于),equation(方程),exit(退出),float(字符串转浮点数),input(输入),math(数学模块),root(根),year(年)。 5. 编程练习 练习51: 编写和调试例56和例57的程序,掌握if语句的使用方法。 案例5: 多条件选择——BMI指数计算 1. 程序案例: 计算BMI指数 BMI(Body Mass Index,体质指数)是国际上常用于衡量人体健康程度的指标(见表51),BMI值过高或过低都不利于身体健康。 表51BMI指数参考标准 BMI分类 WHO标准 中国参考标准NAT 相关疾病发病的危险性 体重过低 BMI<18.5 BMI<18.5 低(其他疾病危险性增加) 正常范围 18.5≤BMI<25 18.5≤BMI<24 平均水平 超重 BMI≥25 BMI≥24 增加 肥胖前期 25≤BMI<30 24≤BMI<28 增加 Ⅰ度肥胖 30≤BMI<35 28≤BMI<30 中度增加 Ⅱ度肥胖 35≤BMI<40 30≤BMI<40 严重增加 Ⅲ度肥胖 BMI≥40.0 BMI≥40.0 非常严重增加 BMI指数计算方法为: BMI=体重(kg)/身高2(m)。 【例59】设计程序,根据输入数据,判断BMI指标是否正常。 案例分析: 编程实现BMI指数计算时,需要考虑以下问题: (1) 对表51进行简化和分类,使它更适合于程序处理(如多条件选择结构)。用专业术语来讲,就是创建表格形式的数学模型。分类结果如表52所示。 表52适合程序处理的BMI指标分类 BMI指标 WHO标准 NAT标准 BMI<18.5 偏瘦 偏瘦 18.5<=BMI<24 正常 正常 24<=BMI<25 正常 偏胖 25<=BMI<28 偏胖 偏胖 28<=BMI<30 偏胖 肥胖 BMI>30 肥胖 肥胖 (2) 根据表52,利用多条件选择语句进行编程处理。 2. 程序设计: 计算BMI指数 案例实现程序如下: 1height =(eval(input('请输入您的身高(厘米):')))/100# 输入数据 2weight =eval(input('请输入您的体重(公斤):'))# 输入数据 3BMI = weight /((height**2)# 计算BMI值 4print(f'您的BMI指数为:{BMI:.2f}')# 打印指数值(2位小数) 5who = nat = ''# 变量初始化(为空) 6if BMI < 18.5:# BMI指标判断 7who, nat = '偏瘦', '偏瘦'# 指标赋值 8elif 18.5 <= BMI < 24:# 多重判断 9who, nat = '正常', '正常' 10elif 24 <= BMI < 25: 11who, nat = '正常', '偏胖' 12elif 25 <= BMI < 28: 13who, nat = '偏胖', '偏胖' 14elif 28 <= BMI < 30: 15who, nat = '偏胖', '肥胖' 16else: 17who, nat = '肥胖', '肥胖' 18print(f'国际BMI标准:{who}; 国内BMI标准:{nat}')# 打印结论 >>> 请输入您的身高(厘米):175# 程序输出 请输入您的体重(公斤):76 您的BMI指数为:24.82 国际BMI标准:正常; 国内BMI标准:偏胖 程序单词: BMI(体质指数),eval(字符转数字),format(格式),height(身高),nat(国内标准值),weight(体重),who(国际标准值)。 3. 编程练习 练习52: 输入三角形三条边的长度,判断能否组成三角形。如果能够组成三角形,判断是普通三角形,还是直角三角形,还是等腰三角形。程序输出如下所示: >>> 请输入三角形a边长度:12 请输入三角形b边长度:23 请输入三角形c边长度:45 不能组成三角形