版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Ch03程序流程控制本章要点:3.1程序的流程3.2顺序结构3.3选择结构3.4循环结构3.5综合应用:turtle模块的复杂图形绘制资源下载提示2课件等资源:扫描封底的“课件下载”二维码,在公众号“书圈”中下载。素材(源码):扫描本书目录上方的二维码下载。讲解视频:扫描封底刮刮卡中的二维码,再扫描书中相应章节中(位于每章最前)的二维码,作为开源的补充阅读和学习资源。
案例研究:扫描封底刮刮卡中的二维码,再扫描书中相应章节中(位于每章最后)的二维码,可以在线学习。电子资源:扫描封底的“补充资源”二维码,在公众号“书圈”中下载,习题参考答案、教学大纲、教学案例、思政刚要和案例分析,以及Python计算生态等补充知识。
题库自测平台:扫描封底刮刮卡中的二维码,登录网站(),进入本书“题库”页面,选择相应章节练习3.1程序的流程输入、处理和输出(IPO)程序通过输入接收待处理的数据(Input));然后执行相应的处理(Process);最后通过输出(Output)返回处理的结果(1)输入数据输入是一个程序的开始。程序要处理的数据有多种来源,形成了多种输入方式,包括交互输入、参数输入、随机数据输入、文件输入、网络输入等。(2)处理数据处理是程序对输入数据进行计算产生输出结果的过程。计算问题的处理方法统称为“算法”。(3)输出结果输出是程序输出结果的方式。程序的输出方式包括控制台输出、图形输出、文件输出、网络输出等【例3.1】计算球体的表面积和体积的程序的IPO描述程序=算法+数据结构算法是执行特定任务的方法数据结构是一种存储数据的方式,有助于求解特定的问题描述算法:自然语言描述&伪代码【例3.2】求解两个整数最大公约数的算法的自然语言描述【例3.3】求解两个整数最大公约数的辗转相除算法的伪代码描述【例3.4】求解两个整数最大公约数的Python代码实现(gcdTest.py)#求解m和n的最大公约数。GCD(m,n)=GCD(n,mModn)defgcd(m,n):if(m<n):m,n=n,mwhile(n!=0):remainder=m%n #计算余数m=nn=remainderreturnmif__name__=='__main__':print(24,36,"的最大公约数为:",gcd(24,36))程序流程图又称为程序框图,是描述程序运行具体步骤的图形表示流程图的基本元素主要包括以下几种【例3.5】使用程序流程图(如图3-2所示)描述计算所输入数据a的平方根的程序3.2顺序结构【例3.6】顺序结构示例(area.py):已知三角形三条边的边长(为简单起见,假设这三条边可以构成三角形),求三角形的面积importmatha=float(input("请输入三角形的边长a:"))b=float(input("请输入三角形的边长b:"))c=float(input("请输入三角形的边长c:"))h=(a+b+c)/2#三角形周长的一半area=math.sqrt(h*(h-a)*(h-b)*(h-c))#三角形面积print(str.format("三角形三边分别为:a={0},b={1},c={2}",a,b,c))print(str.format("三角形的面积={0}",area))3.3选择结构分支结构的形式:单分支、双分支和多分支单分支结构if语句单分支结构的语法形式:当条件表达式的值为真(True)时,执行if后的语句(块),否则不做任何操作,控制将转到if语句的结束点【例3.7】单分支结构示例(if_2desc.py):输入两个数a和b,比较两者大小,使得a大于ba=int(input("请输入第1个整数:")) #输入整数1b=int(input("请输入第2个整数:")) #输入整数2print(str.format("输入值:{0},{1}",a,b)) #显示所输入的两个整数if(a<b): #如果a小于ba,b=b,a #a和b交换print(str.format("降序值:{0},{1}",a,b)) #输出降序排序结果双分支结构if语句双分支结构的语法形式当条件表达式的值为真(True)时,执行if后的语句(块)1,否则执行else后的语句(块)2条件表达式【例3.8】计算分段函数(1)利用单分支结构实现(2)利用双分支结构实现(3)利用条件运算语句实现if(x>=0):y=math.sin(x)+2*math.sqrt(x+math.exp(4))-math.pow(x+1,3)if(x<0):y=math.log(-5*x)-math.fabs(x*x-8*x)/(7*x)+math.eif(x>=0):y=math.sin(x)+2*math.sqrt(x+math.exp(4))-math.pow(x+1,3)else:y=math.log(-5*x)-math.fabs(x*x-8*x)/(7*x)+math.ey=(math.sin(x)+2*math.sqrt(x+math.exp(4))-math.pow(x+1,3))if((x>=0))else\(math.log(-5*x)-math.fabs(x*x-8*x)/(7*x)+math.e)多分支结构if语句多分支结构的语法形式【例3.9】百分制转换为五级制将百分制分数mark转换为五级制(优、良、中、及格、不及格)的评定等级grade方法一:mark=int(input("请输入分数:"))if(mark>=90):grade="优"elif(mark>=80):grade="良"elif(mark>=70):grade="中"elif(mark>=60):grade="及格"else:grade="不及格"方法二:if(mark>=90):grade="优"elif(mark>=80andmark<90):grade="良"elif(mark>=70andmark<80):grade="中"elif(mark>=60andmark<70):grade="及格"else:grade="不及格"方法三:if(mark>=60):grade="及格"elif(mark>=70):grade="中"elif(mark>=80):grade="良"elif(mark>=90):grade="优"else:grade="不及格"【例3.10】判断坐标点象限已知坐标点(x,y),判断其所在的象限(if_coordinate.py)x=int(input("请输入x坐标:"))y=int(input("请输入y坐标:"))if(x==0andy==0):print("位于原点")elif(x==0):print("位于y轴")elif(y==0):print("位于x轴")elif(x>0andy>0):print("位于第一象限")elif(x<0andy>0):print("位于第二象限")elif(x<0andy<0):print("位于第三象限")else:print("位于第四象限")
if语句的嵌套【例3.11】计算分段函数:方法一(多分支结构):if(x>0):y=1elif(x==0):y=0else:y=-1方法二(if语句嵌套结构):if(x>=0):if(x>0):y=1else:y=0else:y=-1方法三:y=1if(x!=0):if(x<0):y=-1else:y=0if语句典型示例代码模式匹配语句match...case自Python3.10开始,引入了结构化模式匹配功能,类似于其他编程语言(例如C#、Swift、Rust等)中的switchcase语句,但功能更强大,支持复杂的模式匹配match...case语句的基本语法结构如下所示match语句对subject进行模式匹配。case子句定义匹配模式(pattern),如果匹配成功,则执行对应的代码块,且后续的case子句不会检查。_是通配符,类似于default,用于匹配任何未明确指定的模式。match...case语句的匹配模式支持解构元组、列表、字典、类实例等,还可以在模式中绑定变量(例如case(x,0):),在case后添加if条件(一般称为守卫条件)进一步筛选match...case可以替代复杂的if-elif-else链,处理不同结构的数据(例如API响应、事件处理),提高代码可读性和可维护性【例3.12】简单的模式匹配1根据http请求所返回的代码返回其名称(200:OK;404:NotFound;500:InternalServerError;_:UnknownStatus)(match_http.py)defhttp_status(status):matchstatus:case200:return"OK"case404:return"NotFound"case500:return"InternalServerError"case_:return"UnknownStatus"print(http_status(200))#输出:OKprint(http_status(404))#输出:NotFound【例3.13】简单的模式匹配2给定年份,判断其生肖(match_chinese_zodiac.py)。中国的十二生肖以12年为一个周期,1900是rat(鼠年),1900%12=4。因此可以进行如下的编码:0:monkey(猴)、1:rooster(鸡)、2:dog(狗)、3:pig(猪)、4:rat(鼠)、5:ox(牛)、6:tiger(虎)、7:rabbit(兔)、8:dragon(龙)、9:snake(蛇)、10:horse(马)、11:sheep(羊)defchinese_zodiac(year):matchyear%12:case0:return"monkey"case1:return"rooster"case2:return"dog"case3:return"pig"case4:return"rat"case5:return"ox"case6:return"tiger"case7:return"rabbit"case8:return"dragon"case9:return"snake"case10:return"horse"case11:return"sheep"print(chinese_zodiac(2020))#输出:ratprint(chinese_zodiac(1998))#输出:tiger【例3.14】简单的模式匹配3给定百分制成绩score,判断其对应的等级成绩(match_grade.py)defmatch_grade(score:float)->str:score_floor=int(score//10)matchscore_floor:case10|9:return"A"case8:return"B"case7:return"C"case6:return"D"case0|1|2|3|4|5:return"F"case_:return"成绩超出有效范围"print(match_grade(85))#输出:Bprint(match_grade(55))#输出:F【例3.15】匹配元组/列表根据列表的两个元素,执行不同的操作(match_list.py)。假设列表的第一个元素是命令,第二个元素是参数,可以使用match…case语句进行判断command=["delete","file.txt"]matchcommand:case["get",filename]:print(f"Downloading{filename}")case["delete",filename]:print(f"Deleting{filename}")case_:print("Unknowncommand")#输出:Deletingfile.txt【例3.16】使用if进行条件匹配在case后添加if条件进一步筛选(match_if.py)。根据年龄,判断是否为未成年(minor,小于18岁)、成年(adult,大于或等于18岁且小于65岁)、老年(senior,其他)defage_type(age):matchage:casexifx<18:return"Minor"casexif18<=x<65:return"Adult"case_:return"Senior"print(age_type(16))#输出:Minorprint(age_type(25))#输出:Adult选择结构综合举例(1)【例3.17】输入三个数,按从大到小的顺序排序(if_3desc.py)先a和b比较,使得a>b;然后a和c比较,使得a>c,此时a最大;最后b和c比较,使得b>ca=int(input("请输入整数a:"))b=int(input("请输入整数b:"))c=int(input("请输入整数c:"))if(a<b):a,b=b,a#a和b交换,使得a>bif(a<c):a,c=c,a#a和c交换,使得a>cif(b<c):b,c=c,b#b和c交换,使得b>cprint("排序结果(降序):",a,b,c)选择结构综合举例(2)【例3.18】编程(leapyear.py)判断某一年是否为闰年。判断闰年的条件是:年份能被4整除但不能被100整除,或者能被400整除方法一。使用一个逻辑表达式包含所有的闰年条件:if((y%4==0andy%100!=0)ory%400==0):print("是闰年")else:print("不是闰年")方法二。使用嵌套的if语句:if(y%400==0):print("是闰年")else:if(y%4==0):if(y%100==0):print("不是闰年")else:print("是闰年")else:print("不是闰年")方法三。使用if-elif语句:if(y%400==0):print("是闰年")elif(y%4!=0):print("不是闰年")elif(y%100==0):print("不是闰年")else:print("是闰年")方法四。使用calendar模块的isleap函数判断闰年if(calendar.isleap(y)):print("是闰年")else:print("不是闰年")选择结构综合举例(3)【例3.19】给定坐标点(x,y),利用match...case语句判断其所在的象限(match_coordinate.py)defquadrant(point):matchpoint:case(0.0,0.0):return"原点"case(x,0.0):return"x轴上"case(0.0,y):return"y轴上"case(x,y)ifx>0andy>0:return"第一象限"case(x,y)ifx<0andy>0:return"第二象限"case(x,y)ifx<0andy<0:return"第三象限"case(x,y)ifx>0andy<0:return"第四象限"case_:return"无效坐标"print(quadrant((0,0)))#输出:原点print(quadrant((2,3)))#输出:第一象限3.4循环结构(1)for语句和while语句来实现循环结构可迭代对象(iterable)for循环>>>foriin(1,2,3): print(i,i**2,i**3)3.4循环结构(2)range对象从start开始,到stop结束(不包含stop)。如果指定了可选的步长step,则序列按步长增长【例3.20】利用for循环求1~100中所有奇数的和以及偶数的和(for_sum1_100.py)>>>foriinrange(1,11):print(i,end='')#输出:1234567891012345678910>>>foriinrange(1,11,3):print(i,end='')#输出:1471014710sum_odd=0;sum_even=0 #循环赋初值foriinrange(1,101): #i=1~100ifi%2!=0: #奇数
sum_odd+=i #奇数和
else: #偶数
sum_even+=i #偶数和print("1~100中所有奇数的和:",sum_odd)print("1~100中所有偶数的和:",sum_even)while循环(1)【例3.21】利用while循环求
,以及1~100中所有奇数的和、偶数的和(while_sum.py)i=1;sum_all=0;sum_odd=0;sum_even=0while(i<=100):sum_all+=i#所有数之和if(i%2==0):#偶数sum_even+=i#偶数和else:
#奇数sum_odd+=i#奇数和i+=1print("和=%d、奇数和=%d、偶数和=%d"%(sum_all,sum_odd,sum_even))while循环(2)【例3.22】用如下近似公式求自然对数的底数e的值,直到最后一项的绝对值小于10-6为止(while_e.py)i=1;e=1;t=1while(1/t>=pow(10,-6)):t*=ie+=1/ti+=1print("e=",e)循环的嵌套在一个循环体内又包含另一个完整的循环结构,称为循环的嵌套【例3.23】利用嵌套循环打印运行效果如图3-6所示的九九乘法表(nest_for.py)思考:请修改程序,分别打印如图所示的2个九九乘法表:foriinrange(1,10):#外循环s=""forjinrange(1,10):#内循环s+=str.format("{0:1}*{1:1}={2:<2}",i,j,i*j)break语句(1)用于退出for、while循环,即提前结束循环,接着执行循环语句的后继语句当多个for、while语句彼此嵌套时,break语句只应用于最里层的语句,即break语句只能跳出最近的一层循环【例3.24】使用break语句终止循环(break.py)whileTrue:s=input('请输入字符串(按Q或者q结束):')ifs.upper()=='Q':breakprint('字符串的长度为:',len(s))break语句(2)【例3.25】编程(prime1.py和prime2.py)判断所输入的任意一个正整数是否为素数方法一(利用for循环和break语句):importmathm=int(input("请输入一个整数(>1):"))k=int(math.sqrt(m))foriinrange(2,k+2):ifm%i==0:break#可整除,肯定非素数,结束循环ifi==k+1:print(m,"是素数!")else:print(m,"是合数!")方法二(利用while循环和bool变量):importmathm=int(input("请输入一个整数(>1):"))k=int(math.sqrt(m))flag=True#先假设所输整数为素数i=2while(i<=kandflag==True):if(m%i==0):flag=False#可整除,肯定非素数,结束循环else:i+=1if(flag==True):print(m,"是素数!")else:print(m,"是合数!")continue语句(1)结束本次循环,即跳过循环体内自continue下面尚未执行的语句,返回到循环的起始处,并根据循环条件判断是否执行下一次循环continue语句与break语句的区别continue语句仅结束本次循环,并返回到循环的起始处,循环条件满足的话就开始执行下一次循环;而break语句则是结束循环,跳转到循环的后继语句执行continue语句(2)【例3.26】使用continue语句跳过循环。要求输入若干学生成绩(按Q或q结束),如果成绩<0,则重新输入。统计学生人数和平均成绩num=0;scores=0;#初始化学生人数和成绩和whileTrue:s=input('请输入学生成绩(按Q或q结束):')ifs.upper()=='Q':breakiffloat(s)<0:#成绩必须>=0continuenum+=1#统计学生人数scores+=float(s)#计算成绩之和continue语句(3)【例3.27】显示100~200之间不能被3整除的数(continue_div3.py)。要求一行显示10个数j=0#控制一行显示的数值个数print('100~200之间不能被3整除的数为:')foriinrange(100,200+1):if(i%3==0):continue
#跳过能被3整除的数print(str.format("{0:<5}",i),end="")#每个数占5个位置,不足后面加空格,并且不换行j+=1if(j%10==0):print()
#一行显示10个数后换行死循环(无限循环)如果while循环结构中循环控制条件一直为真,则循环将无限继续,程序将一直运行下去,从而形成死循环程序死循环时,会造成程序没有任何响应;或者造成不断输出(例如控制台输出,文件写入,打印输出等)在程序的循环体中,插入调试输出语句print,可以判断程序是否为死循环。注意,有的程序算法十分复杂,可能需要运行很长时间,但并不是死循环可以使用快捷键<Ctrl>+<c>终止当前程序的运行【例3.28】死循环示例(infinite.py)2importmathwhileTrue:#循环条件一直为真num=float(input("请输入一个正数:"))print(str(num),"的平方根为:",math.sqrt(num))print("Goodbye!")else子句【例3.29】使用for语句的else子句(for_else.py)hobbies=""foriinrange(1,3+1):s=input('请输入爱好之一(最多三个,按Q或q结束):')ifs.upper()=='Q':breakhobbies+=s+''else:print('您输入了三个爱好。')print('您的爱好为:',hobbies)enumerate函数和循环Python语言的for循环直接迭代对象集合中的元素,如果需要在循环中使用索引下标访问集合元素,则可以使用内置的enumerate()函数enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,并返回一个可迭代对象,故在for循环当中可直接迭代下标和元素【例3.30】enumerate函数和下标元素循环示例seasons=['Spring','Summer','Autumn','Winter']fori,sinenumerate(seasons,start=1):#start默认从0开始print("第{0}季节:{1}".format(i,s))zip函数和循环zip()函数将多个可迭代的对象中对应的元素打包成一个个元组,然后返回一个可迭代对象。如果元素个数不一致,则返回列表长度与最短的对象相同利用运算符*,还可以实现将元组解压为列表【例3.31】zip函数和并行循环>>>x=[1,2,3]>>>y=[4,5,6]>>>zip(x,y)#输出:<zipobjectat0x000001E663DEB988>>>>list(zip(x,y))#输出:[(1,4),(2,5),(3,6)]>>>a,b=zip(*zip(x,y))>>>a,b
#输出:((1,2,3),(4,5,6))evens=[0,2,4,6,8]odds=[1,3,5,7,9]fore,oinzip(evens,odds):print("{0}*{1}={2}".format(e,o,e*o))map函数和循环map(func,seq1[,seq2,…])函数将func作用于seq中的每一个元素,并将所有的调用结果作为可迭代对象返回。如果func为None,作用等同于zip()函数【例3.32】map函数和循环示例>>>list(map(abs,[-1,0,7,-8]))
#计算绝对值。输出:[1,0,7,8][1,0,7,8]>>>list(map(pow,range(5),range(5)))#计算乘幂。输出:[1,1,4,27,256][1,1,4,27,256]>>>list(map(ord,'abcdef'))
#计算ASCII码。输出:[97,98,99,100,101,102][97,98,99,100,101,102]>>>list(map(lambdax,y:x+y,'abc','de'))#字符串拼接。输出:['ad','be']['ad','be']循环语句典型示例代码循环结构综合举例(1)【例3.33】使用牛顿迭代法求解平方根计算一个正实数a的平方根,可以使用牛顿迭代法实现:首先假设t=a,开始循环。如果t=a/t(或小于容差),则t等于a的平方根,循环结束并返回结果;否则,将t和a/t的平均值赋值给t,继续循环EPSILON=1e-15
#容差a=float(input("请输入正实数a:"))#正实数at=a
#假设平方根t=awhileabs(t-a/t)>(EPSILON*t):t=(a/t+t)/2.0
#将t和a/t的平均值赋值给tprint(t)
#输出a的平方根循环结构综合举例(2)【例3.34】显示Fibonacci数列:1、1、2、3、5、8、……的前20项f1=1;f2=1foriinrange(1,11):print(str.format("{0:6}{1:6}",f1,f2),end="")#每次输出2个数,每个数占6位,空格分隔ifi%2==0:print()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026年山东省苏教版高三地理一轮复习自然地理第四章测试卷
- 2025-2026年陕西省湘教版高三语文第11单元文学理论测试卷
- 工程交接项目统计表
- 广东大湾区一模-2026届高三-2026年1月-语文-答案
- 【8道第一次月考】安徽省阜阳市颍上县2025-2026学年八年级上学期10月月考道德与法治试题(含解析)
- 2027届湖北省随州市第二高级中学物理高三上期中学业质量监测试题含解析
- 模式识别与数据挖掘 课件 第9、10章-频繁模式挖掘、专家先验驱动交互
- 医院感染暴发控制与多重耐药菌考核试题及答案
- 湖南省长沙市望城区第二中学2026-2027学年高二(上)开学考试化学试卷(含答案)
- 倡导绿色实践环保行动准则
- 2026非洲食品冷链物流行业市场现状分析及冷链技术与食品安全保障研究报告
- 2026年绵阳市涪城区社区工作者招聘考试真题(附答案)
- 环保专业设计计算公式大全(全领域综合版)
- 陆上风力发电工程施工质量验收规程
- 2026年上半年新生儿科专科知识测试卷附答案详解【突破训练】
- 2026年证券从业资格《证券公司合规管理》真题汇编专项练习
- 办公室内部运转制度
- 质量分析培训课件
- 实训室安全准入培训课件
- 分级护理病人安全管理视频讲座
- 2025年中国建设银行校园招聘笔试真题及权威解析
评论
0/150
提交评论