第3 章流程控制 3.1 本章语法 1.流程控制 流程控制是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程 序)运行或求值的顺序。流程控制分为三种: 1)顺序结构 顺序结构是指语句从上到下顺序执行。 2)选择结构 选择结构是依指定变量或表达式的结果,决定后续运行的程序,选择结构通过if语 句,分3种形式: . 单分支:如果条件正确就执行一个单向if语句。当且仅当条件为true时,一个 单向if语句执行一个动作。注意:if块中的语句都要在if语句之后缩进。格 式为: if 判断条件: 执行语句块 . 双分支:双向if-else语句根据条件是真还是假来决定要执行哪一个动作。如果 条件是True,那么if语句执行第一个动作,但当条件是False使用双向if-else来 执行第二个动作。格式为: if 判断条件: 执行语句块1 else: 执行语句块2 . 多分支:Python不支持switch语句,常用的多分支是if…elif…else判断语句。 格式为: if 判断条件1: 执行语句块1 elif 判断条件2: 执行语句块2 Python 程序设计学习辅导 elif 判断条件3: 执行语句块3 else: 执行语句块4 3)循环结构 循环结构是指一段在程序中只出现一次,但可能会连续运行多次的代码。循环分2 种形式: .for循环:该循环可指定运行次数。格式为: for 循环变量in 迭代器: 执行语句块 迭代器有很多类型,例如:range函数、字符串、列表、元组、字典、集合等。 . while循环:该循环可指定继续运行条件(或停止条件),比较重视对循环条件的 判断语句进行执行循环的动作。格式为: while 判断条件: 执行语句块 绝大多数场景下,for循环与while循环可以互相替代。 2.条件表达式 选择结构和循环结构中,都要根据条件表达式的值来确定下一步的执行流程。在条 件表达式中会经常用到关系运算符(==、!=、<、>、>=、<=)和逻辑运算符(and、or、 no)。 使用各种运算符可以构建不同的条件表达式,例如:假设有整数x,如果满足x%2==0, 则表示x为一个偶数;满足x%3==0andx%10==5,则表示x是3的倍数且个位 上数字为5。假设三角形的3条边分别为a、b、c,如果满足(a+b>c)and(b+c>a)and (a+c>b)and(a>0)and(b>0)and(c>0),则表示a、b、c能构成一个三角形。 3.range函数 range函数是Python中的一个内置函数,调用这个函数就能产生一个迭代序列,因 此适合放在for语句的头部,range函数有3种不同的调用方式: .range(n):得到的迭代序列为:0,1,2,3,…,n-1。例如:range(100)表示序列 0,1,2,3,…,99。当n小于等于0的时候序列为空。 .range(m,n):得到的迭代序列为:m,m + 1,m + 2,…,n-1。例如:range (11,16)表示序列11,12,13,14,15。当m>=n的时候序列为空。 .range(m,n,d):得到的迭代序列为:m,m +d,m +2d,…,按步长值d递增, 如果d为负则递减,直至那个最接近但不包括n的等差值。因此range(11,16,2) 表示序列11,13,15;而range(15,4,-3)表示的序列为:15,12,9,6。 24 第3 章 流程控制 4.break和continue语句 for语句和while语句都是通过头部控制循环的执行,一旦进入循环体,就会完整地 执行一遍其中的语句,然后再重复。实际中,也会遇到一些只执行循环体中的部分语句就 结束循环或者立刻转去做下一次循环的情况,那么就需要用到循环控制语句break和 continue。 break语句的作用是立刻结束整个for循环,continue语句的作用是结束这一轮的循 环,程序跳转到循环头部,根据头部的要求继续。 循环中的else用法:碰到break、return,打破整个循环,不执行else;碰到continue, 只是跳出单次循环,整个循环完毕还是会执行else。 5.嵌套 Python语言允许选择嵌套和循环嵌套以及选择和循环彼此嵌套。 循环嵌套是指在一个循环体里面嵌入另一个循环,将嵌套在里面的循环当作一个语 句来看,相对外面的循环,每次执行完整的内存循环,常用的有两种形式: .for循环嵌套for循环,格式为: for 循环变量1 in 迭代器1: for 循环变量2 in 迭代器2: 执行语句块1 执行语句块2 . while里嵌套while循环,格式为: while 判断条件1: while 判断条件2: 执行语句块1 执行语句块2 当然,for循环里也可以嵌套while循环,while循环里也可以嵌套for循环,因为比较 容易出错,不建议混用。 选择和循环彼此嵌套是指在一个选择里面嵌入一个循环,或者一个循环里嵌套一个 选择,同样,将嵌套在里面的选择或循环当作一个语句来看,常用的有两种形式: . 选择里嵌套循环,格式为: if 判断条件: for 循环变量in 迭代器: 执行语句块1 执行语句块2 else: 执行语句块3 . 循环里嵌套选择:常见的应用是穷举法,如鸡兔同笼问题的求解。格式为: 25 Python 程序设计学习辅导 for 循环变量in 迭代器: if 判断条件: 执行语句块1 break else: 执行语句块2 3.2 本章示例 【例3.1】 用不同的流程控制方法实现:输入三角形三条边的边长,计算三角形的 面积。方 法1: import math a = input() b = input() c = input() h = float(a+b+c)/2 area = math.sqrt(h*(h-a)*(h-b)*(h-c)) print "%.2f"%area 用例输入: 345 用例输出: area=6.00 用例输入: 22.3 3.5 5.4 则无用例输出,程序运行报错。 代码解析:采用顺序结构实现,不存在对三角形三边数据是否合法的判断,当输入的 三角形三边不能构成三角形时,无法计算三角形面积,所以无用例输出,运行后程序报错, 提示错误原因是第2行代码语法无效,从根源上推测原因是输入有误! 如图3.1所示。 方法2: import math a = input() 26 第3 章 流程控制 图3.1 输入三角形三边运行出错界面 b = input() c = input() if (a+b>c) and (a+c>b) and (b+c>a) and (a>0) and (b>0) and (c>0): h = float(a+b+c)/2 area = math.sqrt(h*(h-a)*(h-b)*(h-c)) print "area=%.2f"%area else: print " Three sides are illegal, can't form a triangle. " 用例输入: 345 用例输出: area=6.00 用例输入: 22.3 3.5 5.4 用例输出: Three sides are illegal, can't form a triangle. 代码解析:采用选择控制,对输入的三个边,不同的情况做出不同的处理,程序出现 了分支,如果输入的三角形三边边长为合法数据时,程序才会求面积值,否则告诉用户数 据有误,不能构成三角形。 【例3.2】 用不同的选择结构方法实现:从键盘输入两个数a 和b,比较a 和b 的大 小,保证降序输出。 27 Python 程序设计学习辅导 方法1: a = input() b = input() if a=b,满足降序要求,则无需作处理。 方法2: a = input() b = input() if ab and a>c: m = a if b>a and b>c: m = b if c>a and c>b: m = c print m 用例输入: 673 用例输出: 6 7 3 7 代码解析:采用了整除“//”和求余“%”运算符来分离整数的每一位。 方法2: #coding=utf-8 num = input() a = str(num)[0] #取num 的百位数字 b = str(num)[1]#取num 的十位数字 c = str(num)[2]#取num 的个位数字 print a,b,c if a>b and a>c: m = a if b>a and b>c: m = b if c>a and c>b: m = c print m 用例输入: 673 用例输出: 6 7 3 7 代码解析:分离一个三位整数,利用字符串的索引取元素,因此,在索引取元素之前 需要用str函数将输入的数据从数值类型转换为字符串类型。 【例3.5】 用不同的循环语句实现:求1至100中所有整数的和。 30 第3 章 流程控制 方法1: s=0 for i in range(1,101): s=s+i print s 无用例输入 用例输出: 5050 代码解析:采用for循环的方法,利用了range函数作迭代器。 方法2: s=0 i=1 while i<=100: s=s+i i=i+1 print s 无用例输入 用例输出: 5050 代码解析:采用while循环的方法,指定i<=100作继续运行条件(或停止条件)。 【例3.6】 用循环方法实现:求1至100中奇数和偶数的和分别是多少。 sum_odd=0 sum_even=0 for i in range(1,101): if i%2==1: sum_odd=sum_odd+i else: sum_even=sum_even+i print "sum_odd=",sum_odd print "sum_even=",sum_even 无用例输入 用例输出: sum_odd= 2500 sum_even= 2550 代码解析:与例3.5的方法1代码相比,实际上就是在for循环里嵌套一个双分支if 语句判断奇偶。 31 Python 程序设计学习辅导 【例3.7】 用不同的循环控制语句实现:求1至10中能被3整除的数,并输出。 方法1: for i in range(1, 10+1): if i % 3 == 0: break print i, 无用例输入 用例输出: 1 2 代码解析:采用break控制循环,当i是3的倍数的时候,执行break语句。break语 句的作用是立刻结束整个for循环,因此输出只有1和2两个数字。 方法2: 例3.13: for i in range(1, 10+1): if i % 3 == 0: continue print i, 无用例输入 用例输出: 1 2 4 5 7 8 10 代码解析:采用continue 控制循环,当i是3 的倍数时,执行continue 语句。 continue语句的作用是结束这一轮的循环,程序跳转到循环头部,根据头部要求继续,因 此输出不是3的倍数的所有数字。 【例3.8】 用不同的循环控制语句实现:输出0至4中的数。 方法1: for i in range(5): print i, else: print "for over" 无用例输入 用例输出: 0 1 2 3 4 for over 代码解析:没有break循环控制,因此遍历结束而正常退出循环,将会执行else中的语句。 方法2: for i in range(5): 32 第3 章 流程控制 if i >= 3: break print i, else: print "for over" 无用例输入 用例输出: 0 1 2 代码解析:有break循环控制,因此满足if条件,执行break语句,提前退出循环,将 会导致else中语句不被执行。思考:如果将break换成continue,结果是什么? 【例3.9】 判断一个正整数n(n≥2)是否为素数。素数又称质数。一个大于1的自 然数,除了1和它自身外,不能被其他整数整除的数叫作素数;否则称为合数。 n = input() for i in range(2, n): if n % i == 0: print "no" break else: print "yes" 用例输入: 3 用例输出: yes 用例输入: 8 用例输出: no 代码解析:采用嵌套的语法实现,巧用循环中的else用法,即素数是从来没有满足if 条件,当循环执行到最后,是正常退出时,才执行else子句。 【例3.10】 采用不同嵌套方法实现:斐波拉契数列1,1,2,3,5,8,……的前n 项输出。 方法1: n=input() a,b=1,1 for i in range(1,n+1): if i>1: a,b=b,a+b 33 Python 程序设计学习辅导 print a, 用例输入: 6 用例输出: 1 1 2 3 5 8 代码解析:输出时,输出数的后面跟着一个逗号,可实现多个数以空格分隔。 方法2: n=input() a,b=1,1 for i in range(1,n+1): if i>1: a,b=b,a+b print a, if i%4==0: print 用例输入: 6 用例输出: 1 1 2 3 5 8 代码解析:输出时,除了输出数的后面跟着一个逗号,实现多个数以空格分隔之外, 还增加了一个if单分支选择结构,实现输出时每隔4个换1行。 【例3.11】 采用不同嵌套方法实现:输出300以内的素数。 方法1: for n in range(2,300): for i in range(2, n): if n % i == 0: break else: print n, 无用例输入 用例输出: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 34 第3 章 流程控制 代码解析:实现300以内素数的输出。 方法2: count=0 for n in range(2,300): for i in range(2, n): if n % i == 0: break else: count=count+1 print count 无用例输入 用例输出: 62 代码解析:实现统计300以内的素数个数。 【例3.12】 采用穷举法实现:鸡兔同笼,这是中国古代著名的数学题之一。大约在 1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:“今有雉兔同 笼,上有三十五头,下有九十四足,问雉兔各几何?”这四句话的意思是:有若干只鸡和兔 同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。问笼中各有几只鸡和兔? m,n=input() for i in range(m+1): j=m-i if j>=0 and i*4+2*j==n: print j,i break else: print "no result" 用例输入: 35,94 用例输出: 23 12 代码解析:穷举法思路是利用for循环穷举所有可能,用if进行条件验证,即for循 环里嵌套if选择结构。 3.3 本章练习题 本章的练习题可以分为3次完成,第1次练习侧重选择结构语法掌握,第2次练习测 重循环结构语法掌握,第3次练习侧重相对复杂的循环嵌套、循环选择嵌套等用法。 35 Python 程序设计学习辅导 流程控制练习1 【练习3.1】 三角形面积计算。 题目描述:输入三角形三条边的边长,判断能否构成三角形,如果能构成三角形,则 计算三角形的面积并输出(保留2位小数),否则输出“不能构成三角形”。 用例输入: 22.3,3.5,5.4 用例输出: 不能构成三角形 用例输入: 3.12,4.3,5.789 用例输出: 6.58 【练习3.2】 两数降序排序。 题目描述:从键盘输入两个数,要求降序(按由大到小的顺序)排序输出。 用例输入: 35 用例输出: 5 3 【练习3.3】 成绩通过判断。 题目描述:从键盘输入百分制成绩,如果大于或等于60,则输出"Congratulation! Pass.",否则输出"Sorry! Fail."。 用例输入: 55 用例输出: Sorry!Fail. 用例输入: 98 用例输出: Congratulation!Pass. 36 第3 章 流程控制 【练习3.4】 水的状态。 题目描述:从键盘上输入一个温度值,输出所对应的水的状态。假设约定,0度和 100度为液态。 用例输入: 37 用例输出: liquid 用例输入: -5 用例输出: solid 用例输入: 123 用例输出: gas 【练习3.5】 奇偶判断。 题目描述:从键盘输入一个正整数,判断是否奇数还是偶数。 用例输入: 21 用例输出: odd 用例输入: 56 用例输出: even 【练习3.6】 船够坐吗? 题目描述:班级春游,有40人要过河,租m 条小船(每条小船限乘4人)和n 条大船 (每条大船限乘6人),m 和n 从键盘输入,请输出够坐还是不够坐? 用例输入: 81 37 Python 程序设计学习辅导 用例输出: no 用例输入: 63 用例输出: yes 【练习3.7】 成绩合法校验。 题目描述:从键盘输入成绩,判断是否合法。[0-100]为合法,其余为非法。 用例输入: 88 用例输出: valid 用例输入: 120 用例输出: invalid 【练习3.8】 PM 指数。 题目描述:根据输入的雾霾PM 指数值,判断空气质量,若PM<100 为“较好”; 100≤PM≤150为“轻度”;150