第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法
3.1 条件的描述 3.1.1 关系运算 Python 的关系运算符有 : <( 小于 ) <=( 小于等于 ) >( 大于 ) >=( 大于等于 ) ==( 等于 )!=( 不等于 ) 关系运算符用于两个量的比较判断 由关系运算符将两个表达式连接起来的式子就称为关系表达式, 它用来表示条件, 其一般格式为 : 表达式 1 关系运算符表达式 2 例如,i+j==k,a<b+c
3.1.2 逻辑运算 1. 逻辑运算符 Python 的逻辑运算符有 : and( 逻辑与 ) or( 逻辑或 ) not( 逻辑非 ) 其中 and 和 or 运算符要求有两个运算量, 用于连接两个条件, 构成更复杂的条件 not 运算符只作用于后面的一个逻辑量
2. 逻辑表达式逻辑表达式是用逻辑运算符将逻辑量连接起来的式子 除 not 以外,and 和 or 构成的逻辑表达式一般形式为 : P 逻辑运算符 Q 其中 P,Q 是两个逻辑量
例写出下列条件 (1) 判断年份 year 是否为闰年 (2) 判断 ch 是否为小写字母 (3) 判断 m 能否被 n 整除 (4) 判断 ch 既不是字母也不是数字字符 条件 1:(year%4==0 and year%100!=0) or year %400==0 条件 2:ch>='a' and ch<='z' 条件 3:m%n==0 或 m- m/n*n==0 条件 4: not((ch>='a' and ch<='z') or (ch>='a' and ch<='z') or (ch>='0' and ch<='9'))
3. 逻辑运算的重要规则逻辑与 (and) 和逻辑或 (or) 运算分别有如下性质 : (1)a and b: 当 a 为 False 时, 不管 b 为何值, 结果为 False (2)a or b: 当 a 为 True 时, 不管 b 为何值, 结果为 True 对于 a and b, 当 a 的可解释为 False, 则表达式值为 False, 否则表达式的值为 b; 对于 a or b, 如果 a 为 False, 则表达式的值为 b, 否则表达式值为 True
3.1.3 测试运算 1. 成员测试 in 运算符用于在指定的序列中查找某个值是否存在, 存在返回 True, 否则返回 False 该运算符的使用格式是 x in y, 如果 x 在 y 序列中则返回 True, 否则返回 False 例如 : >>> 3 in(20,15,3,14,5) True
not in 的含义是, 如果在指定的序列中没有找到值, 则返回 True, 否则返回 False 对于 x not in y, 如果 x 不在 y 序列中返回 True, 否则返回 False 例如 : >>> 3 not in(20,15,3,14,5) False
2. 身份测试身份运算符用于测试两个变量是否指向同一个对象 例如 : >>> a=20 >>> b=20 >>> a is b True >>> a is not b False
3.2 选择结构的实现 3.2.1 单分支选择结构可以用 if 语句实现单分支选择结构, 其一般格式为 : if 表达式 : 语句块
单分 支 if 语句的执 行过程
例 3-2 输入两个整数 a 和 b, 先输出较大数, 再输出较小数 分析 : 输入 a,b, 如果 a<b, 则交换 a 和 b, 否则不交换, 最后输出 a,b 程序如下 : a,b=eval(input(" 输入 a,b:")) if a<b: # 若 a<b, 交换 a 和 b, 否则不交换 a,b=b,a print("{0},{1}".format(a,b))
3.2.2 双分支选择结构可以用 if 语句实现双分支选择结构, 其一般格式为 : if 表达式 : 语句块 1 else: 语句块 2
双分 支 if 语句的执 行过程
例输 入三 角形的三个边 长, 求三 角形的 面积 分析 : 设 a,b,c 表 示三 角形的三个边 长, 则构成三 角形的充分必要条件是任意两边之和 大于第三边, 即 a+b>c,b+c>a, c+a>b 如果该条件满 足, 则可按照海伦公式计算三 角形的 面积 : s = p(p a)(p b)(p c) 其中 p=(a+b+c)/2
程序如下 : from math import * a,b,c=eval(input("a,b,c=")) if a+b>c and a+c>b and b+c>a: p=(a+b+c)/2 s=sqrt(p*(p- a)*(p- b)*(p- c)) print("a={0},b={1},c={2}".format(a,b,c)) print("area={}".format(s)) else: print("a={0},b={1},c={2}".format(a,b,c)) print("input data error")
例输入 x, 求对应的函数值 y 分析 : 这是一个具有两个分支的分段函数, 为了求函数值, 可以采用双分支结构来实现 程序如下 : from math import * x=eval(input("x=")) if x<0: y=log(- 5*x)+fabs(x) else: y=sin(x)+sqrt(x+exp(2))/(2*pi) print("x={},y={}".format(x,y))
还可以采用两个单分支结构来实现, 程序如下 : from math import * x=eval(input("x=")) if x<0: y=log(- 5*x)+fabs(x) if x>=0: y=sin(x)+sqrt(x+exp(2))/(2*pi) print("x={},y={}".format(x,y)) 思考 : 第一个 if 语句能否不写, 并分析原因 第二个 if 语句能否不用, 并分析原因
3.2.3 多分支选择结构多分支 if 语句的一般格式为 : if 表达式 1: 语句块 1 elif 表达式 2: 语句块 2 elif 表达式 3: 语句块 3 elif 表达式 m: 语句块 m [else: 语句块 n]
多分 支 if 选择结构的执 行过程
例输入学生的成绩, 根据成绩进行分类, 85 以上为优秀,70~84 为良好,60~69 为及格,60 以下为不及格 分析 : 将学生成绩分为四个分数段, 然后根据各分数段的成绩, 输出不同的等级 程序分为四个分支, 可以用四个单分支结构实现, 也可以用多分支 if 语句实现
程序如下 : g=float(input(" 请输入学生成绩 :")) if g<60: print(" 不及格 ") elif g<70: print(" 及格 ") elif g<85: print(" 良好 ") else: print(" 优秀 ")
3.2.4 选择结构的嵌套 if 语句中可以再嵌套 if 语句, 例如, 有以下不同形式的嵌套结构 语句一 : if 表达式 1: if 表达式 2: 语句块 1 else: 语句块 2 语句二 : if 表达式 1: if 表达式 2: 语句块 1 else: 语句块 2
3.3 条件运算 Python 的条件运算有三个运算量, 其一般格式为 : 表达式 1 if 表达式 else 表达式 2 条件运算的运算规则是, 先求 if 后面表达式的值, 如果其值为 True, 则求表达式 1, 并以表达式 1 的值为条件运算的结果 如果 if 后面表达式的值为 False, 则求表达式 2, 并以表达式 2 的值为条件运算的结果 例如,z=x if x>y else y
例生成 3 个两位随机整数, 输出其中最大的数 这里用条件运算表达式来实现, 程序如下 : import random x=random.randint(10,99) y=random.randint(10,99) z=random.randint(10,99) max=x if x>y else y max=max if max>z else z print("x={0},y={1},z={2}".format(x,y,z)) print("max=",max)
3.4 选择结构程序举例 例输入一个整数, 判断它是否为水仙花数 所谓水仙花数, 是指这样的一些三位整数 : 各位数字的立方和等于该数本身, 例如 153=1 3 +5 3 +3 3, 因此 153 是水仙花数 分析 : 关键的一步是先分别求三位整数个位 十位 百位数字, 再根据条件判断该数是否为水仙花数
例输入一个时间 ( 小时 : 分钟 : 秒 ), 输出该时间经过 5 分 30 秒后的时间 hour=int(input(' 请输入小时 :')) minute=int(input(' 请输入分钟 :')) second=int(input(' 请输入秒 :')) second+=30 if second>=60: second=second- 60 minute+=1 minute+=5 if minute>=60: minute=minute- 60 hour+=1 if hour==24: hour=0 print('{0:d}:{1:d}:{2:d}'.format(hour,minute,second))
例硅谷公司员工的工资计算方法如下 : (1) 工作时数超过 120 小时者, 超过部分加发 15% (2) 工作时数低于 60 小时者, 扣发 700 元 (3) 其余按每小时 84 元计发 输入员工的工号和该员工的工作时数, 计算应发工资
分析 : 为了计算应发工资, 首先分两种情况, 即工时数小于等于 120 小时和大于 120 小时 工时数超过 120 小时时, 实发工资有规定的计算方法 而工时数小于等于 120 小时时, 又分为大于 60 和小于等于 60 两种情况, 分别有不同的计算方法 所以程序分为 3 个分支, 即工时数 >120 60< 工时数 120 和工时数 60, 可以用多分支 if 结构实现, 也可以用 if 的嵌套实现
例输入年月, 求该月的天数 分析 : 用 year month 分别表示年和月, day 表示每月的天数 考虑到以下两点 (1) 每年的 1 3 5 7 8 10 12 月, 每月有 31 天 ;4 6 9 11 月, 每月有 30 天 ; 闰年 2 月有 29 天, 平年 2 月有 28 天 (2) 年份能被 4 整除, 但不能被 100 整除, 或者能被 400 整除的年均是闰年