第3 章 程序基本流程控制 程序从主体上说都是顺序执行的,例如,前面章节中的程序都是按照语句的先后顺序 依次执行的。但现实世界中的逻辑处理会更加复杂,因此在多数情况下,需要让程序在总 体顺序执行的基础上,根据所要实现的功能选择执行一些语句而不执行另外一些语句,或 者反复执行某些语句。程序设计时,通常有顺序结构、选择结构和循环结构三种基本 结构。本 章学习编程中常用的选择结构和循环结构,从而实现较为复杂的程序逻辑。 3.1 选择结构语句 选择结构又称为分支结构,根据判断条件表达式是否成立(True或False)决定下一 步选择执行特定的代码。 在Python语言中,条件语句使用关键字if、elif、else来表示,基本语法格式如下。 if 条件表达式1: if 语句块1 [elif 条件表达式2: elif 语句块2 else: else 语句块3] 其中,冒号是语句块开始标记,方括号内为可选项。 在Python中,条件表达式的值只要不是False、0(或0.0、0j等)、""、()、[]、{}、空值 (None)、空对象,Python解释器均认为其与True等价。也就是说,所有Python合法表 达式(算术表达式、关系表达式、逻辑表达式等,包括单个常量、变量或函数)都可以作为条 件表达式。 选择结构分为单分支结构、双分支结构、多分支结构、嵌套分支结构等多种形式。 3.1.1 单分支结构 单分支结构的语法格式如下。 if 条件表达式: 语句块 第3 章 程序基本流程控制 41 功能:单分支结构中只有一个条件。如果条件表达式的值为True,则表示条件满 足,执行语句块;否则不执行语句块。一个语句块中可以包含多条语句。 Python程序是依靠代码块的缩进体现代码之间的逻辑关系的。行尾的冒号表示缩 进的开始,缩进结束就表示一个代码块结束了。整个if结构就是一个复合语句。 同一级别的语句块的缩进量必须相同。 【例3-1】 输入一个人的身高和体重,然后根据BMI指数判断肥胖程度或健康程度。 实现代码如下。 height = float(input("请输入您的身高(单位为m):")) weight = float(input("请输入您的体重(单位为kg):")) bmi=weight/(height*height) #用于计算BMI 指数,公式为"体重(kg)/身高的平方(m2)" print("您的BMI 指数为:"+str(round(bmi,2))) #输出BMI 指数 #判断肥胖程度或健康程度 if bmi<18.5: print("您的体重过轻。") if bmi>=18.5 and bmi<24.9: print("正常范围,注意保持。") if bmi>=24.9 and bmi<29.9: print("您的体重过重。") if bmi>=29.9: print("肥胖!") 运行结果如下。 请输入您的身高(单位为m):1.7 请输入您的体重(单位为kg):85 您的BMI 指数为:29.41 您的体重过重。 3.1.2 双分支结构 双分支结构的语法格式如下。 if 条件表达式: 语句块1 else: 语句块2 功能:双分支结构可以表示两个条件。如果条件表达式的值为True,则执行语句块 1;否则执行语句块2。 【例3-2】 询问你的年龄,如果年龄大于或等于18岁,输出“恭喜! 你成年了。”,如果 小于18岁,输出“要年满18岁才成年,你还差x岁。”。 42 Python 程序设计与数据分析基础 实现代码如下。 age = int(input("你的年龄是:")) if age >= 18: print("恭喜!你成年了。") else: diff = str(18 - age) print("要年满18 岁才成年,你还差" + diff + " 岁。") 运行结果如下。 第一种情况: 你的年龄是:20 恭喜!你成年了。 第二种情况: 你的年龄是:15 要年满18 岁才成年,你还差3 岁。 注意:一个if语句最多只能有一个else子句,且else子句必须是整条语句的最后一 个子句,else没有条件。其中else不能单独使用,它必须与保留字if一起使用。 在程序中使用if…else语句时,如果出现if语句多于else语句的情况,那么该else语 句将会根据缩进确定该else语句属于哪个if语句。 3.1.3 多分支结构 多分支结构的语法格式如下。 if 条件表达式1: if 语句块1 elif 条件表达式2: elif 语句块2 elif 条件表达式3: elif 语句块3 [else: else 语句块4] 功能:使用if…elif…else语句时,条件表达式可以是一个单纯的布尔值或变量,也可 以是比较表达式或逻辑表达式,如果条件表达式为真,执行语句;如果条件表达式为假,则 跳过该语句,进行下一个elif的判断;只有在所有条件表达式都为假的情况下,才会执行 else中的语句。 【例3-3】 编写程序,判断工作年龄是否合法,我国的合法工作年龄是18~60岁,即 如果年龄小于18岁的情况为童工,不合法;如果年龄为18~60岁的是合法工龄;大于60 岁是法定退休年龄。 第3 章 程序基本流程控制 43 实现代码如下。 age = int(input('请输入您的年龄:')) if age < 18: print(f'您的年龄是{age},童工一枚') elif (age >= 18) and (age <= 60): print(f'您的年龄是{age},合法工龄') elif age > 60: print(f'您的年龄是{age},可以退休') 运行结果如下。 请输入您的年龄:20 您的年龄是20,合法工龄 需要注意的是,if和elif都需要判断条件表达式的真假,而else不需要判断;另外, elif和else都必须与if一起使用,不能单独使用。 3.1.4 嵌套分支结构 多分支结构也可以使用嵌套分支结构实现。语法格式如下。 if 条件表达式1: 语句块1 if 条件表达式: 语句块2 else: 语句块3 else: if 条件表达式4: 语句块4 上述格式中,外层的if块中嵌套了一个if…else结构,外层的else块中嵌套了一个if结构。 【例3-4】 判断是否为酒后驾车。 国家质量监督检验检疫局发布的《车辆驾驶人员血液、呼气酒精含量阈值与检验》中 规定:车辆驾驶人员血液中的酒精含量小于20mg/100ml不构成饮酒驾驶行为;酒精含 量大于或等于20mg/100m 而小于80mg/100ml为饮酒驾车;酒精含量大于或等于 80mg/100ml为醉酒驾车。 要求使用嵌套的if语句,实现根据输入的酒精含量值判断是否为酒后驾车的功能。 实现代码如下。 degree = int(input("请输入每100 毫升血液的酒精含量:")) if degree <20: 44 Python 程序设计与数据分析基础 print("您还不构成饮酒驾驶行为,可以开车,请注意安全。") else: if degree <80: print("已经达到酒后驾驶标准,请不要开车。") else: print("已经达到醉酒驾驶标准,千万不要开车。") 运行结果如下。 请输入每100 毫升血液的酒精含量:25 已经达到酒后驾驶标准,请不要开车。 注意:代码的逻辑级别是通过代码的缩进量控制的,同一级别的语句块的缩进量必 须相同。 3.2 循环结构语句 循环结构是指满足一定条件的情况下,重复执行特定代码块的一种编码结构。其中, 被重复执行的代码块称为循环体,判断是否继续执行的条件称为循环终止条件。 Python中常见的循环语句是while语句和for语句两种格式。 while循环与for循环的思路类似,区别在于while循环需要通过条件来实现逻辑控 制,而不能像for循环那样直接读取序列对象。 3.2.1 while 循环 while语句通过条件表达式建立循环。 while循环可实现无限循环,即永远执行。无限循环的本质是死循环,仅在特定场景 下使用,因此应该在循环中设计退出机制。 while循环的语法格式如下。 while 条件表达式: 循环体 当条件表达式的值为True时,执行循环体的语句,循环体中可以包含多条语句,这 些语句都会被重复执行。while语句中必须有改变循环条件的语句(也就是有把循环条 件改变为False的代码),否则会进入死循环。 【例3-5】 模拟取款机密码输入。一般在取款机上取款时需要输入6位银行卡密码, 接下来我们模拟一个简单的取款机(只有一位密码,默认密码为0),每次要求用户输入一 位数字密码,并对如下3种情况进行判断:如果密码正确输出“密码输入正确,正进入系 统!”;如果输入错误,输出“密码输入错误,您已经输错*次”;如果密码连续输入错误6 次,输出“您的卡将被锁死,请与发卡行联系!”。 第3 章 程序基本流程控制 45 实现代码如下。 password=0 i = 1 while i < 7: num = input("请输入一位数字密码:") num = int(num) if num == password: print("密码输入正确,正进入系统!") i=7 else: print("密码输入错误,您已经输错",i,"次") i += 1 if i == 7: print("您的卡将被锁死,请与发卡行联系!") 运行结果如下。 请输入一位数字密码:6 密码输入错误,您已经输错1 次 请输入一位数字密码:2 密码输入错误,您已经输错2 次 请输入一位数字密码:0 密码输入正确,正进入系统! 3.2.2 for 循环 for循环是一个依次重复执行的循环。通常适用于枚举或遍历序列,以及要迭代对象 中的元素。由于可迭代对象每次返回一个元素,因而适用于循环。Python包括以下几种 可迭代对象:①序列(sequence),例如字符串(str)、列表(list)、元组(tuple)等;②字典 (dict);③文件对象;④迭代器对象(iterator);⑤生成器函数(generator)。 迭代器是一个对象,表示可迭代的数据集合,包括方法__iter__ ()和__next__(),可以 实现迭代功能。生成器是一个函数,使用yield语句,每次产生一个值,也可以用于循环迭代。 for循环的语法格式如下。 for 迭代变量in 序列或迭代对象: 循环体 其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任 意有序的序列对象,循环体为一组被重复执行的语句。 for语句依次从序列或可迭代对象中取出一个元素并赋值给变量,然后执行循环体代 码,直到序列或可迭代对象为空。 46 Python 程序设计与数据分析基础 使用for语句处理列表时,程序会自动迭代列表对象,不需要定义和控制循环变量, 代码更简洁。 【例3-6】 计算1+2+3+4+…+100的结果。 实现代码如下。 print("计算1+2+3+4+…+100 的结果为:") result=0 for i in range(1,101,1): result += i print(result) 运行结果如下。 计算1+2+3+4+…+100 的结果为: 5050 本例中的range()函数属于Python内置的函数,返回一个可迭代对象,语法格式 如下。 range(start, end, step) 参数说明如下。 .start是指定计数的起始值,可以省略,若省略默认值为0。 .end为指定计数的结束值(但不含该值),不可缺省。 .step是指定计数的步长,即两个数之间的间隔,可以省略,若省略默认值为1。 这个函数的功能是,产生以start为起点,以end为终点(不包括end),以step为步长 的整型列表对象。这里的3个参数可以是正整数、负整数或者0。 在使用range()函数时,如果只有一个参数,那么表示指定的是end;如果有两个参 数,则表示指定的是start和end;当3个参数都存在时,最后一个参数才表示步长。 3.2.3 循环嵌套 在Python中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。 在Python中,for循环和while循环都可以进行循环嵌套。 【例3-7】 使用循环嵌套实现打印九九乘法表。 实现代码如下。 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('') #换行 第3 章 程序基本流程控制 47 运行结果如下。 1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 1×4=4 2×4=8 3×4=12 4×4=16 1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81 上述示例使用了双层for循环,第1个循环可以看成是对乘法表行数的控制,同时也 是每一个乘法公式的第2个因数;第2个循环控制乘法表的列数,列数的最大值应该等于 行数,因此第2个循环的条件应该是在第1个循环的基础上建立的。 在循环嵌套中,如果外层循环执行n次,内层循环执行m 次,则整个循环需要执行 n×m 次。 【例3-8】 猜数字游戏。每一个数字可以连续猜6次,每人可以连续猜3个数字。 实现代码如下。 from random import randint for i in range(4): # 控 制 竞猜的轮次 print('***猜第{0}个数***'.format(i+1)) x = randint(0,100) for j in range(6): # 控 制 一轮的竞猜次数 guess = int(input("请输入1 到100 的数: ")) if guess == x: print('恭喜你,猜对了!') break elif guess > x: print('很遗憾,太大了!') else: print('很遗憾,太小了!') print('第{0}次竞猜结束'.format(i+1)) 运行结果如下。 ***猜第1 个数*** 请输入1 到100 的数: 23 很遗憾,太小了! 请输入1 到100 的数: 87 很遗憾,太小了! 48 Python 程序设计与数据分析基础 请输入1 到100 的数: 99 恭喜你,猜对了! 第1 次竞猜结束 ***猜第2 个数*** 请输入1 到100 的数: 3.3 break、continue与else语句 在循环结构中,还可以使用break、continue和else等语句控制循环过程或处理循环 结束后的工作。 在循环过程中,有时可能需要提前跳出循环,或者跳过本次循环的剩余语句以提前进 行下一轮循环,在这种情况下,可以在循环体中使用break语句或continue语句。如果存 在多重循环,则break语句只能跳出其所属的那层循环。break语句和continue语句通 常与if语句配合使用。 1.break语句 break语句可以终止当前的循环,包括while和for在内的所有控制语句。 break语句的语法比较简单,只需要在相应的while或for语句中加入即可。break 语句一般与if语句搭配使用,表示在某种条件下,跳出循环。如果使用嵌套循环,break 语句将跳出最内层的循环。 【例3-9】 输入一个整数,判断是否为素数。素数是只能被1和自身整除的数,例如 对于9,要判断9能否被2~8的数整除:如果能,说明不是素数;如果都不能,说明是 素数。实 现代码如下。 number = int(input("请输入整数:")) #9:2~8 if number < 2: print("不是素数") else: for i in range(2, number): if number % i == 0: print("不是素数") break #如果有结论了,就不需要再与后面的数字计算了 else: print("是素数") 运行结果如下。 请输入整数:9 不是素数 第3 章 程序基本流程控制 49 2.continue语句 continue语句的作用没有break语句那么强大,它只能终止本次循环而提前进入到 下一次循环中。 continue语句的语法比较简单,只需要在相应的while或for语句中加入即可。 continue语句一般与if语句搭配使用,表示在某种条件下,跳过当前循环的剩余语句,然 后继续进行下一轮循环。如果使用嵌套循环,continue语句将只跳过最内层循环中的剩 余语句。 【例3-10】 设计一个验证用户密码程序,用户只有三次输入机会,不过如果用户输 入的内容中包含“*”,则不计算在内。 实现代码如下。 count = 3 password = '123' while count: passwd = input('请输入密码:') if passwd == password: print('密码正确,进入程序......') break elif '*' in passwd: print('密码中不能含有"*"号!您还有',count,'次机会!',end=' ') continue else: print('密码输入错误!您还有',count-1,'次机会!',end=' ') count -= 1 运行结果如下。 请输入密码:666 密码输入错误!您还有2 次机会! 请输入密码:125 密码输入错误!您还有1 次机会! 请输入密码:123 密码正确,进入程序...... 3.else语句 while语句和for语句的后边还可以带有else语句,用于处理循环结束后的“收尾” 工作。 else语句的语法格式如下。 格式1: while 条件表达式: 循环体 50 Python 程序设计与数据分析基础 else: else 子句代码块 格式2: for 迭代变量in 序列或迭代对象: 循环体 else: else 子句代码块 else子句是可选的。如果有else子句,则当循环因为条件表达式不成立或序列遍历 完毕而自然结束时,就会执行else子句的代码。如果有else子句,但循环因为执行了 break语句而使得循环提前结束的,则不会执行else子句的代码。 【例3-11】 编写程序,随机产生骰子的一面(数字1~6),给用户三次猜测机会,程序 给出猜测提示(偏大或偏小)。如果某次猜测正确,则提示正确并中断循环;如果三次均猜 错,则提示机会用完。 分析:使用随机函数产生随机整数,设置循环初值为1,循环次数为3,在循环体中输 入猜测并进行判断,如果密码正确则使用break语句中断当前循环。 实现代码如下。 import random point=random.randint(1,6) count=1 while count<=3: guess=int(input("请输入您的猜测:")) if guess>point: print("您的猜测偏大。") elif guessc 、a+c>b 且b+c>a 。 .周长(p)就是三条线段的和,即p=a+b+c 。 .构成等边三角形的条件为a=b=c。 .构成等腰三角形的条件为a=b、a=c或b=c。 .构成直角三角形的条件为a2+b2=c2、a2+c2=b2 或b2+c2=a2。 请根据以上规律编写一个Python程序,实现以下功能: 输入三角形的三条边长,求三角形的周长;若不能构成三角形,则输出提示。 根据用户输入的三角形的三条边长判定是何种三角形(一般三角形、正三角形、等腰 三角形、直角三角形)。