第3章选择结构 3.1知 识 要 点 3.1.1条件的描述 在选择结构和循环结构中,程序是根据条件来执行代码的。Python中条件是一个表达式,表达式的结果对应布尔型(bool)的两个值True或False,True表示条件成立,False代表条件不成立。 当条件表达式的结果值不直接为True或False时,None、任何数值类型中的0、空字符串""、空元组()、空列表[]、空字典{}、空集合等都等价于False,其他值等价于True。 1. 关系运算符 关系运算符用于比较两个操作数的大小关系,Python的关系运算符见表31。 表31Python的关系运算符 关系运算符数学符号含义 <<小于 <=≤小于等于 >=≥大于等于 >>大于 ===等于 !=≠不等于 Python允许在一个关系表达式中比较多个值,但大小关系不具有传递性,仅当表达式中多个关系运算的计算结果都为True时,才显示True的结果。 2. 逻辑运算符 逻辑运算是对多个逻辑结果进行运算,一般用于表达多个条件之间的相互关系。Python中参与逻辑运算的操作数可以为非布尔型(bool)数据,逻辑运算的结果也可以为非布尔型(bool)数据。表32是Python中的逻辑运算符及其运算规则。 表32Python的逻辑运算符 逻辑运算符含义 not 取反运算。True(或与True等价的数据)变False,False(或与False等价的数据)变True and 与运算。仅当两个操作数的值都等价于True时,运算结果为第二个操作数的值; 若有至少一个操作数等价于False,运算结果就是第一个等价于False的操作数的值 or 或运算。有一个或两个操作数的值等价于True,运算结果就为第一个等价于True的操作数的值; 如果两个操作数都等价于False,运算结果为第二个等价于False的操作数的值 3. 成员运算符 Python的成员运算符用于确认数据是否是序列结构中的某个成员,表33是Python中的成员运算符。 表33Python的成员运算符 成员运算符含义 in在指定的序列中找到值就返回True,否则返回False not in在指定的序列中没有找到值就返回True,否则返回False 4. 身份运算符 Python的身份运算符用于判断是否为同一个对象,表34是Python中的身份运算符。 表34Python的身份运算符和身份函数 身份运算符含义 is判断两个标识符是否引用自一个对象,是就返回True,否则返回False not is判断两个标识符是否引用自不同对象,是就返回True,否则返回False 5. 条件运算符 Python的条件运算符的格式: 表达式1 if 条件 else 表达式2 表示当满足条件则返回表达式1的计算结果,不满足条件则返回表达式2的计算结果。 3.1.2选择结构 1. 单分支结构的if语句 格式如下: if 条件: 语句块 当语句块只有一条语句时,也可以写成如下格式: if 条件: 单语句 2. 双分支结构的if…else语句 格式如下: if 条件: 语句块1 else: 语句块2 3. 多分支结构的if…elif…else语句 格式如下: if 条件1: 语句块1 elif 条件2: 语句块2 elif 条件3: 语句块3 … else: 语句块n 3.2例题分析与解答 一、 选择题 1. 已知x=2,y=8,表达式x+y and y%2的值为。 A. FalseB. TrueC. 10D. 0 分析: 与运算and的运算规则: 仅当两个操作数的值都等价于True时,运算结果为第二个操作数的值,若其中有一个操作数等价于False,运算结果就是第一个等价于False的操作数的值。第一个操作数x+y的值为10,非零值等价True,第二个操作数y%2的值为0,0等价于False,即结果为0。 答案: D 2. 已知x=4,y=7,表达式x+y or y%x的值为。 A. FalseB. TrueC. 11D. 3 分析: 或运算or的运算规则: 只要有操作数的值等价于True,运算结果就为第一个等价于True的操作数的值,否则,运算结果为第二个等价于False的操作数的值。第一个操作数x+y的值为11,非零值等价True,此时,直接取11为整个表达式的结果。系统不再计算表达式中y%2的计算结果。 答案: C 3. 下列正确的语句是。 A. if a>b: print(a) B. if and : print(2) C. if a>0 a=m D. if 3<4: print(3) else print(4) 分析: 选项B中的条件仅出现了一个逻辑运算符是不合法的,选项B是错误的。选项C中单分支语句可以写成一行,但是其条件a>0后必须要有冒号“:”,选项C是错误的。选项D中else后也必须要有冒号“:”,选项D是错误的。选项A中的格式是符合要求的,所以选A。 答案: A 4. 运行以下程序,输入32,则输出结果是。 #1.x=eval(input('x=')) #2.y=0 #3.if x>=0: #4.if x!=0: #5.y=1 #6.else: #7.y=-1 #8.print(y) A. 0B. 1C. -1D. 不确定 分析: eval函数会将由input函数输入的字符串当作一个表达式,所以输入的32会被当作int类型值32赋值给变量x。#2~#7的if结构相当于以下函数: y=-1(x<0) 0(x=0) 1(x>0) #3行中的条件x>=0成立,执行#4行代码,而#4行中的条件x!=0成立,执行#5行代码,y值为1。所以选B。#6的else对齐#3行,即当x<0时,会去执行#7行代码。 答案: B 5. 运行以下程序,输入2,3,则输出结果是。 #1.x,y=eval(input('x,y=')) #2.if x>=y: #3.x,y=y+1,x+1 #4.else: #5.x,y=y-1,x-1 #6.print(x,y) A. 2 1B. 2,1C. 4 3D. 提示语法错 分析: Python采用严格的缩进来表示程序中控制结构的多行间的层次关系。if语句条件后的代码可以写在同一行上,例如if a>1:a=b,此时冒号后可以有空格也可以没有空格。而若条件后的代码换行到下一行时必须缩进至少一个空格。而本题中#3和#5都没有缩进,所以Python会认为该程序不符合语法格式,提示语法错。故本题选D。 答案: D 6. 以下Python表达式不能表示数学中的不等式x≥y≥z的是。 A. x>=y and y>=zB. x>=y>=z C. (x>y)+(y>z)D. not(x=y>=z表示数学中的x≥y≥z,选项B能表示。表达式(x>y)+(y>z)中先计算x>y和y>z,会产生True或False的计算结果,在算术运算+计算时,True会被转换为1,False会被转换为0。而(x>y)+(y>z)只要有一个括号中的结果为True,整个表达式的值即为非0,非0就会等价于逻辑关系True,即与数学不等式x≥y≥z含义不符合,选项C不能表示。逻辑关系not(表达式1 or 表达式2)只有在表达式1和表达式2都不成立时整个表达式结果才为True,即not(x=y and y>=z时条件成立,即等价于选项A。故本题选C。 答案: C 7. 运行以下程序,输出结果是。 #1.a,b,c=2,-1,2 #2.if a>b: #3.if b==0: #4.c=0 #5.else: #6.c=c+1 #7.print(c) A. 0B. 2C. 3D. 无结果 分析: Python采用严格的缩进来表示程序中控制结构的多行间的层次关系。#2行中a>b成立,故执行#3行。而#3中的条件b==0不成立,故#4行不被执行,且因为没有与#3行if对齐的else,即条件不成立时什么都不执行。需要注意,#6行和#7行在#5行的else后缩进,即两者是当#2行条件不成立时,都要执行的语句。不要因为最后一行#7有输出语句,而认为本题一定有输出结果的。本题正确答案是D。 答案: D 8. 以下选项中,不是Python保留字。 A. inB. isC. elseifD. and 分析: 成员运算符in,用于确认数据是否是序列结构中的某个成员。身份运算符is,用于判断是否为同一个对象。逻辑运算符and,用于判断两个条件是否同时成立。Python的if结构中有elif子句,但是没有elseif子句。 答案: C 9. 关于Python的选择结构描述中,错误的是。 A. Python选择结构使用保留字if、else和elif来实现,每个if后面必须有elif或else B. if…else结构是可以嵌套的 C. if语句会判断if后面的逻辑表达式,当表达式为真时,执行if后续的语句块 D. 缩进是Python分支语句的语法部分,缩进不正确会影响分支功能 分析: Python的单分支结构使用if保留字对条件进行判断; 二分支结构使用if…else保留字对条件进行判断; 多分支结构使用if…elif…else保留字对多个相关条件进行判断,并根据不同条件的结果按照顺序选择执行路径。其中,else和elif子句是可选的。 答案: A 二、 填空题 1. 表达式1<2 == 2的值为。 分析: Python中比较运算符连续出现时,先分别独立进行比较,当两个比较结果都成立时,显示为True,否则显示为False。本题中,先分别比较1<2和2==2,两个比较的结果都为True,则整个表达式结果为True。1<2 == 2等价于1<2 and 2==2。 答案: True 2. 表达式 type(3+4j) in (int, float, complex) 的值为。 分析: 单个参数的type函数返回对象的类型,3+4j是复数类型的数据,返回complex。in运算在指定的序列中找值,找到就返回True,否则返回False。序列中有complex,所以返回True。 答案: True 3. 表达式not 1>2 and 3>4的值为。 分析: Python中逻辑运算符中运算优先级由高到低的是not、and、or。故本题中先计算not 1>2,结果为True,再计算3>4,结果为False,最后计算and,最终计算结果为False。 答案: False 4. 运行以下代码,输出结果是。 #1.a=3 #2.b=0 #3.if a <=3: #4.a += 1 #5.b = 10 #6.if a > 3: #7.a -= 1 #8.b = 20 #9.print(a,b) 分析: #3~#5行的if语句和#6~#8行的if语句是各自独立而不是互斥的,它们一前一后都会被执行。变量a初值为3,执行#3行时,if语句条件成立,执行#4、#5行后,a变为4,b变为10。再执行#6行,if语句条件因a变为4而条件成立,故#7、#8行需要执行,a变为3,b变为20。故最后输出结果为3 20。 答案: 3 20 3.3测试题 一、 选择题 1. 关于选择结构,以下选项中描述错误的是。 A. Python中选择结构只有if语句 B. Python中的if语句能支持单分支、双分支和多分支结构 C. elseif是Python中if语句的保留字 D. break语句不能用于跳出if语句 2. 运行以下程序,输出结果是。 #1.g=83 #2.if g>=60: #3.print("及格") #4.elif g>=75: #5.print("良好") #6.elif g>=85: #7.print("优秀") A. 及格B. 良好C. 优秀D. 无结果 3. 运行以下程序,输出结果是。 #1.a=8 #2.b=3 #3.z=0 #4.if z>=0: #5.if a=10>5是合法的,且输出为True 5. 运行以下程序,输出结果是。 #1.a=3 #2.print(a==3.0,a is 3.0) A. True TrueB. True FalseC. False TrueD. False False 6. 运行以下程序,则输出结果是。 #1.x=0 #2.if x=3: #3.print(x) A. 0B. 3C. 不确定的值D. 提示语法错 7. 有变量d记录了出生年份,s记录了性别: '男'或'女',以下if语句能正确判断“出生年份d不在1999—2007(含)的女生”的是。 A. if s='女' and not 1999<=d<=2007∶n+=1 B. if s=='女' and 1999<=d or d<=2007∶n+=1 C. if s='女' and 1999>d or d>2007∶n+=1 D. if s=='女' and not 1999<=d<=2007∶n+=1 8. Python中,实现多分支操作的if语句是。 A. ifB. if…elseC. if…elif…elseD. 不能实现 9. 已知变量x中的值是数值型的,与关系式x==0等价的表达式是。 A. x=0B. not xC. xD. x!=1 10. 已知x=1,y=2,则表达式x!=y>5。 A. 等价于(x!=y)>5B. 等价于x!=y or y<5 C. 等价于x!=y and y>5D. 等价于x!=(y>5) 11. 若a=58和b=True,则表达式a-b>51/3是。 A. 58B. 57C. TrueD. False 12. 以下Python保留字中,可用于分支结构的是。 A. elseifB. elifC. breakD. endif 13. 以下表达式计算结果为False的是。 A. 'abc'<'ab' B. 'hello'<'hi' C. ' '<'z' D. 'A'+'B'+'C'=='ABC' 14. 表达式False/True的计算结果是。 A. TrueB. 出错C. 0D. 1 15. 关于Python的选择结构描述中,描述错误的是。 A. 双分支结构有一种紧凑形式,使用保留字if和elif实现 B. if语句中条件部分可以使用任何能够产生True和False的表达式和函数 C. if语句中语句块执行与否依赖于条件判断 D. 多分支结构用于设置多个判断条件以及对应的多条执行路径 二、 填空题 1. 表达式'ab' in 'acbed' 的值为【1】。表达式'ac' in 'acbed' 的值为【2】。 2. 已知A=3.5,B=5.0,C=2.5,D=True,则表达式A>0 and A+C>B+3 or not D的值为。 3. 运行以下程序,输出结果是。 #1.x=3 #2.y=3 #3.x is y 4. Python中的选择结构语句是语句。 5. 表达式xz的含义是。 三、 编程题 1. 编写程序: 输入一个整数,判断其奇偶性。 2. 编写程序: 输入两个数值区间后,若能合并区间,则输出合并后的区间,否则显示“Failed!”。例如,输入区间[3.4,56.7]和[-3,9.8],输出显示“[-3,56.7]”。 3. 市区“一日游”收费标准为: 5人以内(含5人)按散客标准,每人160元; 超过5人,按团体标准,每人140元。编写程序输入人数,输出旅游总费用。 4. 大学校园里,有人骑自行车有人走路,但是并非骑车的人一定快于走路的人,因为找停车位置、停车、锁车、开锁等总要耗费一些时间。假设骑车的人找车、开锁到骑上车平均耗费25秒,找停车位、停车、锁车平均耗费30秒。假设步行每秒行走1.2米,骑车每秒行走3.0米。编写程序,输入去办事点的距离,判断是骑车快还是走路快,骑车快则输出Bike,走路快则输出Walk,如果一样快则输出Both。 5. 编写程序: 输入三角形的三边,当构成三角形时,计算面积,否则输出出错提示。 6. 编写程序: 根据下列函数关系,对输入的每个x值,计算出相应的y值。 y= 0(x<0) x(0>> x=3 #2.>>> y=5 #3.>>> 2>> 22 #5.>>> 210 #6.>>> x>2 and y>5 #7.>>> x>2 or y>5 #8.>>> x and y #9.>>> not x and y #10.>>> x or y 二、 成员运算符和身份运算符的初步使用 1. 实验目的 掌握成员运算符和身份运算符的基本使用规则。 2. 实验要求 在交互执行方式下输入语句,记录执行结果(注: 如果显示大段出错提示,可以简记为“出错”)。 3. 实验内容 #1.>>> a=10 #2.>>> b=5 #3.>>> list=[1,2,3,4,5] #4.>>> a in list #5.>>> a not in list #6.>>> b in list #7.>>> b not in list #8.>>> x=3 #9.>>> id(x) #10.>>> id(3) #11.>>> x is 3 #12.>>> 3 is x #13.>>> y=3 #14.>>> id(y) #15.>>> x is y 三、 判断闰年 1. 实验要求 输入某一年份x,判断该年份是否为闰年,是则输出“yes”,否则输出“no”。输入代码,保存到程序文件Ex33.py中,运行程序并观察结果。 2. 算法分析 判断闰年的条件: ①普通闰年,能被4整除且不能被100整除的是闰年; ②世纪闰年(整百的年份),能被400整除的是闰年。判定整除的方法是看余数是否为0。 程序处理的流程图如图31所示。 图31判断闰年 程序代码如下。 #1. x=int(input()) #2. if x%400==0: #3. Flag=1 #4. elif x%100==0: #5. Flag=0 #6. elif x%4==0: #7.Flag=1 #8. else: #9.Flag=0 #10. if Flag==1: #11.print("闰年") #12. else: #13.print("平年") 四、 判断数据的类型 1. 实验要求 对输入的数据进行判断,显示数据类型或提示输入有错。输入代码,保存到程序文件Ex34.py中,运行程序文件并观察结果,如图32所示。 图32运行结果示例 2. 算法分析 input函数输入任何信息都被当作字符串,直接判断输入信息,无法得到正确结果。故使用eval()函数将输入的信息转换为数据,并赋值给变量x。但当遇到输入的内容不是合法数据时,赋值就会出错,故本程序利用try语句而不是if语句来编写。 3. 实现代码 #1. try: #2.x=eval(input('请输入数据: ')) #3.except: #4.print('输入的是不符合Python要求的数据') #5.else: #6.print(x,'is',type(x)) 4. 运行结果记录 输入数据显示结果记录 123123 is "we"we is "123" '''123''' 12.5 1.25e-5 "12.5" 4-5j True None 1,2,3 ('你','好','abx') [1,2,3] {'a','b','c'} {'a':1,'b':2,'c':3} djsdhj#562! 2+3 print(2) 5. 思考题 (1) 观察和分析本程序的运行结果,总结Python各种数据类型的正确表示格式。 (2) 执行程序的快捷键是什么? (3) 2+3和print(2)不是数据,但是程序会有输出结果,为什么? 五、 模拟自动售货机 1. 实验要求 模拟自动售货机的程序,运行程序时提示用户可以选择的商品。当用户输入后,提示所选择的内容。输入代码,保存到 图33运行结果 程序文件Ex35.py中,运行程序并观察结果,如图33所示。 2. 实现代码 #1.print('*********') #2.print('*可选的按键: *') #3.print('*1.巧克力*') #4.print('*2.蛋糕*') #5.print('*3.可口可乐*') #6.print('*********') #7.a=int(input()) #8.if a==1: #9.print('你选了巧克力!') #10.elif a==2: #11. #12.elif a==3: #13. #14.else: #15.print('无此选项!') 3. 思考题 (1) 将#7行中的int函数弃之不用,代码的执行结果如何?为什么? (2) 若坚持#7行必须是a=input(),如何修改#8~#15行的代码,使程序能正确运行? 六、 求解一元二次方程的根 1. 实验要求 对于一元二次方程ax2+bx+c=0,输入其三个系数a、b、c,输出方程的实根。输入代码,保存到程序文件Ex36.py中,运行程序并观察结果。 2. 算法分析 根据方程的三个系数a,b,c,当a≠0时,按一元二次方程根的公式-b±b2-4ac2a求解。先判断b2-4ac≥0是否成立,成立则有实根,不成立则没有实根。当a=0时,方程退化为一元一次方程,根为-cb。 3. 实现代码 完善以下代码,实现本题的要求。 #1.import #2.a=float(input('Please input a=')) #3.b=float(input('Please input b=')) #4.c=float(input('Please input c=')) #5.p=b*b-4*a*c #6.if :#一元二次方程有实根解的条件 #7.x1=(-b+math.sqrt(p))/(2*a) #8.x2=(-b-math.sqrt(p))/(2*a) #9.print(x1,x2) #10.elif : # 退化为一元一次方程的条件 #11.x1=x2=-c/b #12.print(x1) #13.else: #14.print('Wrong Number!') 七、 找出三个整数中的最大数 1. 实验要求 输入三个整数a,b,c,使用if语句找出最大数,并输出该最大数。编写并输入代码,保存到程序文件Ex37.py中,运行程序并观察结果。 2. 算法分析 在寻找最大数时,可以有不一样的算法。这里介绍两种算法,算法的流程图如图34所示,按流程图分别编写程序。 图34求三个数中的最大数 八、 计算排队等待时间 旅游旺季时,各大旅游景点的门口都会排起长长的队伍。假设某景点门口,目前在你之前的人数为n人,景点的管理人员每间隔x分钟放入c人,你期望能够在t分钟内进入景点。编写程序,输入n、x、c和t的值,判断你是否能在预期时间t内进入景点。 程序运行时输入n、x、c和t的值,根据这些值判断,能在预期时间内进入的显示“能进!”,否则显示“来不及了!”。 编写并输入代码,保存到程序文件Ex38.py中,运行程序并观察结果。