Python程序设计与应用课件 第3章程序控制结构_第1页
Python程序设计与应用课件 第3章程序控制结构_第2页
Python程序设计与应用课件 第3章程序控制结构_第3页
Python程序设计与应用课件 第3章程序控制结构_第4页
Python程序设计与应用课件 第3章程序控制结构_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计与应用第3章

程序控制结构学习目标知识目标理解程序设计思想;掌握算法、流程图设计方法;掌握三种程序控制结构使用方法;理解和掌握异常处理机制。技能目标能够设计与开发简单的Python应用程序;能够对程序进行熟练调试;具备一定的程序优化技能。素质目标与课程思政熟悉程序设计过程,培养善于观察、勤于思考的习惯,提高解决问题的分析与归纳能力,树立解决问题的程序化、工程化思想;传承中华优秀传统文化,增强文化自信。知识导图3.1程序设计思想程序通常可以理解为一系列计算机指令的集合,在Python中,是一系列Python命令或语句的集合。程序设计是根据问题的需要,编写解决问题的程序代码,让计算机自动执行。程序设计是计算机软件开发中最重要的过程,涉及到编程思想,主要有面向过程的结构化程序设计(ProcessOrientedProgramming,POP)和面向对象的程序设计(ObjectOrientedProgramming,OOP)。Python同时支持这两种编程思想。结构化程序设计是以模块功能和处理过程设计为主的程序设计方法,其思想由艾兹格.迪科斯彻(E.W.Dijikstra)于1965年提出。它的主要观点是采用自顶向下、逐步求精及模块化的程序设计原则;程序设计中使用三种基本控制结构构造程序,任何程序都可由顺序、分支(选择)、循环结构实现。结构化程序设计原则使程序开发整体清楚、目标明确。整个程序设计过程分成若干层次,逐步加以解决,每一步是在前一步的基础上,逐步细化。因此,一个较复杂的大问题,可以被层层分解成为多个相对独立的、易于解决的小模块。通过模块之间的相互调用来解决整个问题。2026/7/2553.2算法、流程图与程序设计3.2.1算法3.2.2流程图3.2.3程序设计3.2.4程序控制结构3.2.1算法算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤,或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。算法也可简单理解为解决问题的方法和步骤。特点:有穷性,确切性,有效性,输入,输出。例3.1

输入3个实数,输出其中的最大值。①输入3个实数,分别存放到变量A、B、C中。②若A>B,则M=A,否则M=B。③若C>M,则M=C。④输出M。2026/7/2573.2.2流程图实际上,表示算法的形式很多,通常有自然语言、传统流程图、N-S结构化流程图、伪代码、PAD图等。传统流程图使用不同的几何图形框来代表各种不同性质的操作,用流程线来指示算法的执行方向。它的四框一线表示方法符合人们的思维习惯,因此用它描述算法非常直观,便于理解。图3-1传统流程图符号图3-2例3.1流程图2026/7/2583.2.3程序设计程序设计以某种程序设计语言为工具,例如Python,给出这种语法结构下的程序代码。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。(1)分析问题(2)设计算法(3)编写程序(4)运行程序(5)编写程序文档2026/7/2593.2.4程序控制结构序控制结构是指程序中语句执行的流程结构,可以根据需要进行控制。在结构化程序设计中,有3种基本的程序控制结构,分别是顺序结构、分支(选择)结构和循环结构。2026/7/2510

(a)单分支

(b)双分支图3-3顺序结构

图3-4分支结构(a)遍历循环

(b)条件循环图3-5循环结构3.3顺序结构顺序结构是指程序的执行按其中语句的排列从前往后(或从上到下)逐条顺序执行,它是最简单、最基本的程序控制结构,是构成程序框架的基础部分。任何程序中必然包含顺序结构。一个程序主要包括3个基本功能:数据输入、数据处理和数据输出,从操作过程次序来讲,它就是一种顺序结构。图3-3

顺序结构流程图2026/7/25113.3顺序结构2026/7/2512

例3.2编写一个程序,显示以下诗词内容,以求共勉。

冬夜读书示子聿

(宋)陆游古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。print("冬夜读书示子聿")print("(宋)陆游")print("古人学问无遗力,少壮工夫老始成。")print("纸上得来终觉浅,绝知此事要躬行。")3.3顺序结构2026/7/2513例3.3输入圆的半径r,求圆的周长和面积,保留两位小数。frommathimport*r=eval(input("请输入圆的半径r:"))c=2*pi*ra=pi*r*rprint("圆的周长为:{:.2f}\n圆的面积为:{:.2f}".format(c,a))图3-7

例3.3流程图3.3顺序结构2026/7/2514例3.4任意输入两个整型数据到变量x和y中,交换它们的值后输出。x,y=eval(input("输入两个整数x,y(以英文逗号间隔):"))t=xx=yy=tprint(x,y)图3-9例3.4流程图3.4分支结构3.4.1单分支结构3.4.2双分支结构3.4.3多分支结构3.4.4分支结构嵌套3.4.1单分支结构单分支结构:if<条件表达式>:<语句块>功能:计算<条件表达式>的值,若值为True,执行<语句块>,然后去执行if结构后面的语句;若值为False,则直接执行if结构后面的语句,<语句块>不执行。单分支结构的流程图如图3-11所示。图3-11

单分支结构说明:①<条件表达式>可以是关系表达式、逻辑表达式或各种类型的数据。对于数值型数据,非零为True,0为False。对于字符串或者集合类数据,空字符串和空集为False,其余为True;②if语句的<条件表达式>后面必须加冒号(:);③<语句块>必须右缩进;语句块可以是单条语句,也可以多条语句;多条语句时必须缩进一致。2026/7/2516例3.5任意输入3个数x、y、z。按x>y>z排序,并按序输出x,y,z。x,y,z=eval(input("输入数x,y,z:"))ifx<y:x,y=y,xifx<z:x,z=z,xify<z:y,z=z,yprint("{}>{}>{}".format(x,y,z))图3-12

例3.5流程图2026/7/25173.4.1单分支结构

例3.6根据PM2.5检测网的空气质量新标准,24小时平均值标准值分为以下6级。PM2.5数值在0~35的空气质量等级为“优”,35~75为“良”,75~115为“轻度污染”,115~150为“中度污染”,150~250为“重度污染”,250~500为“严重污染”。试编程实现输入一个PM2.5值,输出其空气质量等级。为简化操作,将大于等于75的PM2.5值统一划分为“污染”,这样空气质量分为3级模式:优、良、污染。pm=eval(input("请输入PM2.5值:"))if0<=pm<35:re="优"if35<=pm<75:re="良"if75<=pm:re="污染"print("空气质量为:{}".format(re))print("{}>{}>{}".format(x,y,z))2026/7/25183.4.1单分支结构3.4.2双分支结构双分支结构:if<条件表达式>:<语句块1>else:<语句块2>功能:计算<条件表达式>的值,若其值为True,执行<语句块1>(可以是单条或多条语句),然后执行if结构后面的语句;若其值为False,执行<语句块2>(也可以是单条或多条语句),然后执行if结构后面的语句。即<语句块1>和<语句块2>根据条件成立与否择其一执行,流程图如图3所示。图3-15双分支结构2026/7/2519注意:①<条件表达式>与单分支结构的一致。②if<条件表达式>和else后面的冒号(:)不能省略,而且if和else必须对齐。③<语句块1>和<语句块2>必须有相同的缩进。3.4.2双分支结构例3.7从键盘输入一个正整数,判断其奇偶性。x=int(input("请输入一个正整数:"))ifx%2==0:print("{}是偶数!".format(x))else:print("{}是奇数!".format(x))例3.8任意输入一个正整数作为年份,判断该数是否为闰年。闰年的条件是:年份是4的倍数且不是100的倍数,或者年份是400的倍数。year=int(input("请输入一个年值:"))ifyear%4==0andyear%100!=0oryear%400==0:print("{}年是闰年!".format(year))else:print("{}年是平年!".format(year))2026/7/25203.4.3多分支结构多分支结构:if<条件表达式1>:<语句块1>elif<条件表达式2>:<语句块2>……elif<条件表达式n>:<语句块n>[else:<语句块n+1>]功能:计算<条件表达式1>的值,若其值为True,执行<语句块1>(可以是单条或多条语句);否则计算<条件表达式2>的值,若其值为True,则执行<语句块2>(可以是单条或多条语句),以此类推。只要执行了一个分支就不会执行其他分支,然后结束if结构。若<条件表达式1至n>都为False,则执行else部分的<语句块n+1>。流程图如图3-18所示。图3-18

多分支结构流程图2026/7/2521注意:①条件<表达式1至n>含义与单分支,双分支的相同;②elif是“elseif”的缩写,elif子句可以有1~n个。<条件表达式>、else后面的冒号不能省略,关键字if、elif、else的缩进相同;③<语句块1>、<语句块2>、……、<语句块n+1>必须有相同的缩进;④else子句可以省略。3.4.3多分支结构例3.9任意输入一个百分制分数,将其转换为五级制(优秀,良好,中等,及格和不及格)。score=eval(input("请输入一个百分制分数:"))ifscore>100orscore<0:print("分数不对,请重输!")elifscore>=90:print("优秀")elifscore>=80:print("良好")elifscore>=70:print("中等")elifscore>=60:print("及格")else:print("不及格")2026/7/25223.4.3多分支结构【例3.10】根据输入的值,计算下列分段函数的值。

x=eval(input("请输入x值:"))ifx<0:y=x**2+3*x-4elifx<=6:y=2*x**2-3*x+3else:y=x**2+2print(y)2026/7/25233.4.4分支结构嵌套在解决实际问题过程中,往往有很多的、层层递进的条件被一次又一次地选择,即选择之后还有选择。在Python程序控制结构中,对于这种情况可由if分支结构套用if分支结构来构成,称为if分支结构嵌套。f分支结构嵌套可以有多层,对于2层的if分支结构嵌套,主要有以下几种形式。(1)第1种

if<条件表达式1>:

if<条件表达式2>:<语句块>(2)第2种if<条件表达式1>:if<条件表达式2>:<语句块1>else:<语句块2>(3)第3种if<条件表达式1>:if<条件表达式2>:<语句块1>else:if<条件表达式3>:<语句块2>(4)第4种if<条件表达式1>:if<条件表达式2>:<语句块1>else:<语句块2>else:if<条件表达式3>:<语句块3>else:<语句块4>if<条件表达式1>and<条件表达式2>:<语句块>

2026/7/2524图3-21第4种分支结构嵌套流程图3.4.4分支结构嵌套例3.11采用分支结构嵌套的方法实现闰年的判断。year=int(input("请输入一个年值:"))ifyear%100==0:ifyear%400==0:print("{}年是闰年!".format(year))else:print("{}年是平年!".format(year))else:ifyear%4==0:print("{}年是闰年!".format(year))else:print("{}年是平年!".format(year))2026/7/25253.4.4分支结构嵌套例3.12求一元二次方程ax2+bx+c=0的根,保留2位小数,a、b、c的值由键盘输入。a,b,c=eval(input("请输入一元二次方程的系数a,b,c:"))#英文逗号间隔ifa==0:ifb==0:print("方程无意义!")else:print("方程仅有一个实根:{:.2f}".format(-b/a))else:delta=b**2-4*a*cre=-b/(2*a)im=abs(delta**0.5/(2*a))ifdelta>0:print("方程有两个不等的实根,分别为:")print("x1={:.2f}\nx2={:.2f}".format(re+im,re-im))else:ifdelta<0:print("方程有一对共轭复根,分别为:")print("x1={:.2f}+{:.2f}i".format(re,im))print("x2={:.2f}-{:.2f}i".format(re,im))else:print("方程有两个相等的实根:\nx1=x2={:.2f}".format(re))2026/7/25263.5循环结构3.5.1for循环3.5.2while循环3.5.3循环转移语句3.5.4循环结构嵌套3.5.1for循环结构对于顺序结构和分支结构,程代码序都是从上到下一次性执行完,中间没有反复执行的部分。凡是在处理过程中存在需要重复处理的操作,都可以考虑用循环结构来实现。在Python中,for循环用于循环次数已确定的情况,又称为“计数循环”或“遍历循环”。循环次数由遍历可迭代对象中的元素个数来确定,处理完可迭代对象中的所有元素后自动结束,其流程图如右图所示。语法结构如下:for<循环变量>in<可迭代对象>:<循环体>功能:取出<可迭代对象>中的第1个元素存放在<循环变量>中,并执行<循环体>语句;然后再取<可迭代对象>中的第2个元素存放在<循环变量>中,并执行<循环体>语句;以此类推,遍历完可迭代对象中所有元素,结束循环。即取一次元素就执行一次循环体,直至遍历完所有元素为止。2026/7/2528说明:通常的<可迭代对象>有字符串、列表、元组、字典、集合等序列数据类型。<可迭代对象>后面的冒号(:)不能省略;循环体语句采用缩进对齐方式,可以是单条语句或多条语句,多条语句应具有相同的缩进。for循环结构自动一个接一个读取<可迭代对象>中的元素,并赋值给循环变量,然后执行循环体。常用内置函数range()来创建数值型可迭代对象,格式为:range(start,end,step)、range(start,end)或range(end)。其中,start表示初值,end表示终值,step表示步长值。例3.13

实现遍历字符串、列表、元组、集合等对象。分析:字符串、列表、元组、集合都是由多个元素组成,用for循环可依次取其中的每个元素,实现遍历。lst="ABC123"#字符串#lst=['A','B','C',1,2,3]#列表#lst=('A','B','C',1,2,3)#元组#lst={'A','B','C',1,2,3}#集合forxinlst:print(x,end="")运行该程序,依次输出字符串中的每个字符,其中间隔一个空格。该结构同样可应用于列表,元组及集合,可遍历其中的每个元素,只要将其中的语句进行代替即可。例3.14

实现遍历字典对象。分析:字典由键和值构成,遍历键名时,可访问其值。dit={"name":"张三","gender":"男","age":20}forkeyindit:print("{}:{}".format(key,dit[key]))2026/7/25293.5.1for循环结构例3.15求s=1!-1/2!+1/3!-1/4!…+(-1)n-11/n!(n>=1),n由键盘输入,结果保留8位小数。n=int(input("请输入n(n>=1):"))s,p,t=0,1,1foriinrange(1,n+1):p=p*is=s+t/pt=-tprint("{:.8f}".format(s))例3.16求Fibonacci数列的前30项,每行输出10个数,并用制表符“\t”间隔。x1=1x2=1print(x1,"\t",x2,end="\t")foriinrange(3,31):x3=x1+x2print(x3,end="\t")ifi%10==0:print()x1,x2=x2,x32026/7/25303.5.1for循环结构3.5.2while循环结构Python的for循环结构主要应用于循环次数确定的场合,特别适合于遍历可迭代对象中的元素。while循环结构是一种通过判断循环条件是否满足来决定继续循环的循环结构,也称为条件循环或当型循环。while循环的语法结构如下:while<条件表达式>:<循环体>功能:先计算<条件表达式>的值,如果值为True,则反复执行<循环体>语句,直到<条件表达式>值为False时退出循环结构。注意:①<条件表达式>可以是关系表达式、逻辑表达式或各种类型的数据。对于数值型数据,非零为True,0为False。对于字符串或者集合类数据,空字符串和空集为False,其余为True;<条件表达式>后面的冒号(:)不能省略。②如果首次计算<条件表达式>的值为False,则直接退出循环体,循环次数为0。③如果<条件表达式>的值永远为True,循环将会永远执行下去(死循环)。此种情况应尽可能避免,可在循环体中修改条件表达式的语句,使其趋向False,让循环逐渐趋于结束,避免死循环。④循环体语句可以单条或多条,必须采用统一的缩进方式。2026/7/25313.5.2while循环结构1)循环次数已确定循环次数已确定是指事先已经知道循环次数的情形。一般处理方法是以定义的循环变量为计数器来控制循环次数,可以用循环升序或循环降序的方法实现。

循环升序的程序代码的结构如下:

循环降序的程序代码的结构如下:功能:已知循环次数,通过对循环控制变量n进行顺序升序计数或降序计数的方法实现循环控制。例3.17

求2~400之间的所有偶数之和。

2026/7/2532i,s=2,0whilei<=400:ifi%2==0:s+=ii+=1print("2~400之间所有偶数之和为:{}".format(s))i,s=400,0whilei>=2:ifi%2==0:s+=ii-=1print("2~400之间所有偶数之和为:{}".format(s))3.5.2while循环结构2)循环次数未确定循环次数未确定是指对于有些问题在编程时并不知道要执行多少次循环,不能直接用循环控制变量来控制循环,改由其它变量控制循环的情形。这种情况可以使用<条件表达式>来控制循环,即为常规的while结构,或利用永真循环结构并在循环体内进行局部更改来间接控制循环,其语法结构如下。

whileTrue:

<语句序列>

if<条件表达式>:

break功能:循环条件永远为True,即永远满足循环条件。只在当if结构中的<条件表达式>为True时,才由break语句跳出循环,结束循环体的运行。其中,语句break为中止循环语句。2026/7/25333.5.2while循环结构例3.18改革开放以来,中国经济飞速发展,取得了举世瞩目的成就。二十大报告指出,近十年来,国内生产总值从54万亿元增长到114万亿元,我国经济总量占世界经济的比重达18.5%,提高7.2个百分点,稳居世界第2位。按目前平均年增长率,经过多少年,国内生产总值可以达200万亿元?2026/7/2534#第一种:frommathimport*times=114/54n=10rate=pow(times,1/n)-1gdp=114year=0whileTrue:year+=1gdp=gdp*(1+rate)ifgdp>200:breakprint("{}年后,GDP可以达200万亿元!".format(year))print("GDP为:{:.2f}万亿元!".format(gdp))#第二种:frommathimport*times=114/54n=10rate=pow(times,1/n)-1gdp=114year=0whileTrue:

year+=1

gdp=gdp*(1+rate)

ifgdp>200:

breakprint("{}年后,GDP可以达200万亿元!".format(year))print("GDP为:{:.2f}万亿元!".format(gdp))3.5.3循环转移语句在Python的for循环结构中,当遍历完“可迭代对象”中的所有元素后,结束循环。在while循环结构中,当条件表达式的值为False时,结束循环。如果希望满足一定条件时跳过其中部分循环体语句,进入下一次循环,或者提前终止循环,或者根据需要,适时转移到其他位置时,可采用循环结构中的转移语句。主要有:break、continue、else、pass。1.break语句break语句用来终止循环,即使“可迭代对象”中还有没遍历的元素或循环条件还为True,也会停止执行循环体语句。该语句用在循环体内,既可用于for循环,也可用于while循环。对于多重循环(循环结构不止一层),如果break语句放在最内层循环中,只能终止最内层循环,而不会影响外层循环体。break语句的格式为:if<条件表达式>:break或者,if<条件表达式>:break功能:先计算<条件表达式>的值,如果值为True,则中止循环体的执行,转至循环结构外的后续语句去执行,<条件表达式>值为False时,继续执行循环体语句。2026/7/25353.5.3循环转移语句2.continue语句continue语句用来提前结束本次循环,即跳过当前循环的剩余语句,并返回到下一次循环的起始位置,重新开始新一轮循环,不影响循环的总次数。该语句用在循环体内,既可用于for循环,也可用于while循环。对于多重循环(循环结构不止一层),如果continue语句放在最内层循环中,只能提前结束最内层循环的当次循环,而不会影响外层循环体。continue语句的格式为:if<条件表达式>:continue或者,if<条件表达式>:continue功能:先计算<条件表达式>的值,如果值为True,则结束本次循环体的执行,转至下一次循环的执行,<条件表达式>值为False时,继续执行循环体内的后续语句。

例3.19分析下列程序执行的结果。

2026/7/2536foriinrange(1,10):ifi%3==0:breakprint(i,end="\t")foriinrange(1,10):ifi%3==0:continue

print(i,end="\t")1

2

4

5

7

81

23.5.3循环转移语句例3.20

判断一个正整数n(n≥2)是否为素数(质数)。素数的定义为:除了1和它本身外,不能被其他整数整除的自然数,否则称为合数。

n=int(input("输入一个正整数n(n>=2):"))flag=1forkinrange(2,n):ifn%k==0:flag=0breakifflag==1:print("{}是素数!".format(n))else:print("{}不是素数!".format(n))例3.21

求两个正整数m和n的最大公约数。m=int(input("输入正整数m:"))n=int(input("输入正整数n:"))ifm>n:t=nelse:t=mforiinrange(t,0,-1):ifm%i==0andn%i==0:print("{}和{}的最大公约数为:{}".format(m,n,i))break

2026/7/25373.5.3循环转移语句3.else语句for、while循环均可以与else语句结合使用,当循环正常退出时执行else语句。语法格式为:

for<循环变量>in<可迭代对象>:<循环体>else:<语句序列>

while<条件表达式>:<循环体>else:<语句序列>

功能:else语句用于循环结构时,在<循环体>语句正常结束后,即在for循环遍历完<可迭代对象>中的所有元素后,或者while循环结构的<条件表达式>为False后执行。但循环体被break语句终止时,else语句不执行。说明:①else与while、for语句的缩进相同,且后面的冒号(:)不能省略。②通常将else语句与break语句结合使用,如果<循环体>语句执行break语句中止循环,则不执行else语句,反之则执行。2026/7/25383.5.3循环转移语句例3.22判断一个正整数是否为素数(质数)。frommathimport*n=int(input("输入一个正整数n(n>=2):"))forkinrange(2,int(sqrt(n))+1):#int(sqrt(n))表示取n的平方根的整数部分ifn%k==0:print("{}不是素数!".format(n))breakelse:print("{}是素数!".format(n))4.pass语句pass语句表示空代码,它不做任何操作,用于在某些时候语法上需要一条语句但实际上什么都不需要做的情况,相当于一个占位符,也可用在以后需要添加程序代码的地方。例如,循环体语句可以是一条语句或多条语句,但不能一条语句也没有,可以用pass语句来代替,表示循环多次,但什么事情也不做。下面程序代码。

表示循环了10次,但什么也没有做。

foriinrang(10):

pass

2026/7/25393.5.4循环结构嵌套一个循环结构的循环体内完整的包含另一个循环结构,称为循环嵌套。这种嵌套的过程可以有很多层,称为多重循环。常用的多重循环有双重循环和三重循环。双重循环的外面一层循环称为外循环,内部被包含的一层循环称为内循环,又称为二重循环。三重循环是在二重循环的外面再增加一层循环结构。本节主要介绍双重循环结构的使用。Python中的2种循环结构for和while之间可以相互嵌套,自由组合,其本身也可以进行嵌套。因此,对于双重循环结构来说,共有4种形式。(1)for<循环变量1>in<可迭代对象1>:

<外层循环体>

……

for<循环变量2>in<可迭代对象2>:

<内层循环体>

……(2)for<循环变量>in<可迭代对象>:

<外层循环体> …… while<条件表达式>:

<内层循环体>

……(4)while<条件表达式1>: <外层循环体> …… while<条件表达式2>:

<内层循环体>……(3)while<条件表达式>:

<外层循环体> …… for<循环变量>in<可迭代对象>:

<内层循环体>……403.5.4循环结构嵌套循环结构嵌套遵守严格的缩进格式,内循环是外层循环的循环体语句的一部分,与其他外循环的循环体语句应具有相同的缩进格式。4种形式严格遵循这种规则。循环结构嵌套程序运行时,程序每执行一次外层循环,其内层循环将完整地执行一遍,当内层循环结束时,才能进入到外层循环的下一次循环。整个程序循环的次数等于外层循环执行次数乘以内层循环执行次数。而且,当break语句或continue语句出现在<内循环体>语句中,其作用范围仅限于内循环结构,不会影响外循环体的循环次数。以双重循环为例,建议循环嵌套结构的设计方法如下。(1)明确内循环要控制的目标,确定内循环的循环次数。(2)明确外循环要控制的目标,确定外循环的循环次数。(3)建立内外循环之间的联系,确定内外循环变量之间的关系。2026/7/25413.5.4循环结构嵌套例3.23求s=1!+3!+5!+…,当s的值超过1010时停止,假设最后一项为n!,求n值。s,n=0,1whiles<=10**10:p=1foriinrange(1,n+1):P*=is+=pn+=2print("s的值为:{}\nn的值为:{}".format(s,n-2))例3.24打印输出如图所示的图形。foriinrange(1,5):

#外循环,控制行数forjinrange(0,10-i):#内循环,输出每行空格数,其中10可调print("",end="")forkinrange(1,2*i):

#内循环,输出每行*号数print("*",end="")print()

#换行2026/7/25423.5.4循环结构嵌套例3.25打印输出九九乘法表,输出如图所示,每式间隔一个制表符。foriinrange(1,10):forjinrange(1,i+1):print("{}*{}={}".format(i,j,i*j),end="\t")print()例3.26“百钱买百鸡”(取自中国古代数学家张丘建的著作《算经》):鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?forxinrange(0,21):foryinrange(0,34):z=100-x-yif5*x+3*y+z/3==100:print("鸡翁:{}\t鸡母:{}\t鸡雏:{}".format(x,y,z))2026/7/25433.6异常处理3.6.1异常类3.6.2异常捕获与处理3.6.1异常类Python在执行程序时,常常出现各种错误提示而影响程序的完整执行或出现错误结果,这些错误可能是语法错误、运行错误或逻辑错误,统称为异常。异常触发后,如果没被处理或捕捉,就会回溯在当前异常处终止程序运行或出现错误结果。因此,须提供一种异常处理机制来增强程序的健壮性与容错性。Python程序错误主要分为语法错误、运行错误和逻辑错误3类。语法错误:指不遵循Python语法规则引起的错误,使得程序无法正常编译和执行,是一种较明显和直接的错误。例如:遗漏了冒号、逗号、括号;关键字拼写错误;缩进不正确等。运行错误:程序在语法上是正确的,但在执行时产生错误。例如:被零除;打开的文件不存在;没有定义的标识符等。逻辑错误:又称为语义错误,指程序的运行结果与预期不符,即错误的运行结果。这种错误极难发现,需要通过分析整个程序结构来纠正。以上三种错误一经Python检测到,便会发生异常,并给出错误提示。Python使用异常对象来表示异常情况,并提供了常见的异常类。所有异常都是从基类Exception继承,而且都在exceptions模块中定义。Python中常见的异常类如表3-1所示。表3-1Python的常见异常类45异常类名说明异常类名说明Exception常见异常类的基类KeyError字典中不存在此键AttributeError该对象无此属性NameError未声明/初始化对象EOFError没有读取数据时,到达文件尾SyntaxError语法错误ImportError导入模块或对象失败SystemError解释器系统错误IndexError序列中不存在的索引TypeError对无效类型的操作IndentationError缩进错误OverflowError数值运算溢出IOError输入/输出操作失败ValueError传入无效的参数KeyboardInterrupt用户中断执行ZeroDivisionError除零3.6.2异常捕获与处理在Python中,可以通过三种方式处理程序执行过程中可能出现的异常和错误,即try…expect、raise和断言。1.try…expectPython提供了try…expect结构进行异常的捕获与处理,其语法结构如下:try:<语句块1>#需要检测异常的<语句块1>except<异常名称1>:<语句块2>#<语句块1>中引发<异常名称1>时执行的<语句块2>[except<异常名称2>:<语句块3>]#<语句块1>中引发<异常名称2>时执行的<语句块3>……[except<异常名称3>as<变量1>:#用<变量1>定义<异常名称3>并执行<语句块4><语句块4>][except<异常名称4>as<变量2>:#用<变量2>定义<异常名称4>并执行<语句块5><语句块5>]……[else:<语句块6>]#没有异常发生时执行<语句块6>[finally:<语句块7>]#不管<语句块1>是否有错误都执行<语句块7>

注意:①try语句块是必需的,except语句块、else语句块、finally语句块是可选的,当然也可以同时出现。②try及<语句块1>有且仅有一个,但except语句块可以有多个。③当程序发生不同的异常情况时,会对应特定的异常类型。④else语句块只有在没有异常发生的情况下才会被执行。⑤finally语句块则不管异常是否发生都会被执行。2026/7/25463.6.2异常捕获与处理例3.27

关于整除的异常处理。分析:输入两个数时,若数据个数不足将出现TypeError,如果除数为0则导致ZeroDivisionError,等等。x,y=eval(input("请输入2个整数x,y:"))try:t=x/yprint(t)exceptTypeError:print("数据类型错误!")exceptZeroDivisionErrorasre:print("除数为0!",re)except:print("异常!")else:print("结果正确!")

2026/7/25473.6.2异常捕获与处理2.raise在Python中,可以主动引发异常,利用raise语句捕获。语法格式如下。raise[<异常类型>][<提示信息>]说明:用[]括起来的为可选参数,其作用是指定抛出的异常名称以及异常信息的相关提示。如果可选参数全部省略,则raise会把当前错误原样抛出;如果仅省略<提示信息>,则在抛出异常时,将不附带任何异常提示信息。例3.28

对下列程序,分析其执行结果。try:x=eval(input())y=50/xexceptExceptionasp:print("捕获异常!")raiseZeroDivisionError("分母不能为0!")print("此语句不执行!")else:print("无异常!")运行程序,共运行2次。当输入为2时,结果为“无异常!”;当输入为0时,捕获异常。2026/7/25483.6.2异常捕获与处理3.assert断言(assert)用来断定条件是否成立,如果不成立,给出异常并终止程序运行。其作用是帮助调试程序,以保证程序运行的正确性,语法格式如下。assert<条件表达式>[<,字符串表达式>]说明:assert语句有2个参数,第1个参数是<条件表达式>,如果值为True,则什么也不做。如果为False,则断言不通过,抛出一个AssertionError异常。第2个参数是错误描述,即断言失败时输出的信息,可以省略。例3.29对下列程序,分析其执行结果。x,y=eval(input("请输入2个整数x,y:"))asserty!=0,"除数不能为0!"z=x/yprint(z)

2026/7/25493.7应用实例3.7.1累加与累乘3.7.2极值3.7.3枚举法3.7.4二维图形3.7.5递推与迭代3.7.1累加与累乘1.整除用来实现判断一个整数能否被另一个整数整除。①ifint(m/n)==m/n②ifm//n==m/n③ifm%n==02.余数用来获取一个整数被另一个整数相除后的余数,余数也是一个整数。①m%n②m-int(m/n)*n#m-(m//n)*n3.累加累加是一种循环操作,表示重复若干次加法运算,通常在循环体中设置一个累加器来实现。首先定义一个变量用来存放和值,例如s,并赋初值0,设x为每次累加的数值,则累加器为:s=s+x或s+=x。可用for循环结构或while循环结构实现循环。4.累乘累乘也是一种循环操作,表示重复若干次乘法运算,通常在循环体中设置一个累乘器来实现。首先定义一个变量用来存放积值,例如p,并赋初值1,设x为每次累乘的数值,则累乘器为:p=p*x或p*=x。可用for循环结构或while循环结构实现循环。513.7.1累加与累乘例3.30

求自然常数e(自然对数的底)的近似值,保留4位小数,其近似公式为:,要求计算到最后一项的值小于10-6为止。s,p,n=1,1,1while1/n>=10e-6:p=p*ns=s+1/pn+=1print("自然常数e的近似值为:{:.4f}".format(s))运行程序,结果为“自然常数e的近似值为:2.7183”。例3.31

统计2~500之间的所有素数,以每行10个数输出显示,并计算其个数和总和。frommathimport*s,r=0,0forninrange(2,501):forkinrange(2,int(sqrt(n))+1):ifn%k==0:breakelse:ifr%10==0:print()r+=1s+=nprint(n,end="\t")print()print("2~500之间的所有素数个数为:{}".format(r))print("2~500之间的所有素数之和为:{}".format(s))523.7.2极值极值用来获取一系列数据中的最大值和最小值。其算法一般为,以其中一个数据(通常是第一个数据)作为最大值或最小值,然后和其余数据比较,并将找到的较大或

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论