python数据处理的流程控制_第1页
python数据处理的流程控制_第2页
python数据处理的流程控制_第3页
python数据处理的流程控制_第4页
python数据处理的流程控制_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

第二次上机总结11、以file的形式写代码,交互式的界面只适合于单语句代码的测试2、file文件中以函数为单位写代码,方便调用以实现代码重用3、inport语句放在程序的开头,即程序总注释后面,第一个函数前面1第二次上机总结2提高课堂效率了解每次课的主要内容2第3章数据处理的流程控制计算机程序根据语句的顺序依次向下执行。#convert.py#AprogramtoconvertCelsiustempstoFahrenheitdefmain():celsius=input("Whatisthe...”)fahrenheit=9.0/5.0*celsius+32print"Thetemperatureis",fahren...main()流程图:用标准化的图形符号来表示程序步骤但这种顺序执行显然是不够的,我们会要求某个功能重复执行,也会要求根据不同的前提条件执行不同的功能,所以引入了另两种控制结构——分支和循环§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计1单分支结构2二分支结构3多分支结构(一)温度转换的例子(eg3_1.py)#convert.py#AprogramtoconvertCelsiustempstoFahrenheitdefmain():celsius=input("Whatisthe...”)fahrenheit=9.0/5.0*celsius+32print"Thetemperatureis",fahren...main()(一)温度转换的例子希望他可以根据不同的温度给出不同的提示。Iffahrenheit>90

printahotwarningIffahrenheit<30

printacoldwarning(一)温度转换的例子:流程图(一)温度转换的例子改进版#convert2.pydefmain():celsius=input("Whatisthe...?")fahrenheit=9.0/5.0*celsius+32print"Thetemperatureis",fahrenheit,...

iffahrenheit>90:print"It'sreallyhotoutthere,..."

iffahrenheit<30:print"Brrrrr.Besuretodresswarmly"main()单分支语句(二)用于执行决策的if语句语法:if<condition>:(iffahrenheit>90:) <body>next语义:先判断条件表达式(condition)true,执行语句体(body),再转向下一个语句false,忽略语句体(body),直接转向下一个语句语句体(body):一个或多个语句在:后面缩进显示,body中的各语句缩进对齐(三)条件表达式的格式简单条件表达式(condition):比较两个表达式

<expr1><relop><expr2>(a+2<=a*2)关系运算:<,<=,==,>=,>,!=数值比较:整型数的比较,实型数的比较字符串比较:按字典序。字母序由编码(ASCII等)决定.如:大写字母在小写字母前.<condition>称为布尔表达式结果为true/false,1/0Relationoperation(关系运算符)§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计1单分支结构2二分支结构3多分支结构求一元二次方程的例子(ver1.0)#quadratic.pyimportmathdef

main():

print"Thisprogramfindsthereal..."a,b,c=input("Pleaseenter..(a,b,c):")discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"Thesolutionsare:",root1,root2main()ThisprogramfindstherealsolutionstoaquadraticPleaseenterthecoefficients(a,b,c):1,1,2Traceback(mostrecentcalllast):File"C:\DocumentsandSettings\Terry\MyDocuments\Teaching\W04\CS120\Textbook\code\chapter3\quadratic.py",line21,in-toplevel-main()File"C:\DocumentsandSettings\Terry\MyDocuments\Teaching\W04\CS120\Textbook\code\chapter3\quadratic.py",line14,inmain

discRoot=math.sqrt(b*b-4*a*c)ValueError:mathdomainerror

ver1.0的运行引入决策分支结构#quadratic2.py,当discrim>=0时才有解importmathdefmain():print"Thisprogramfindstherealsolutions...\n"a,b,c=input("Pleaseenterthe...(a,b,c):")discrim=b*b-4*a*c

ifdiscrim>=0:discRoot=math.sqrt(discrim)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"\nThesolutionsare:",root1,root2main()求一元二次方程的例子(ver2.0)ver2.0的运行结果

Thisprogramfindstherealsolutionstoaquadratic

Pleaseenterthecoefficients(a,b,c):1,1,1

>>>

discRoot<0时,没有任何执行语句就结束了应该给出提示#quadratic2.py的改良importmathdefmain():print"Thisprogramfindstherealsolutions...\n"a,b,c=input("Pleaseenterthe...(a,b,c):")discrim=b*b-4*a*cifdiscrim>=0:discRoot=math.sqrt(discrim)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"\nThesolutionsare:",root1,root2ifdiscRoot<0:print“Theequationhasnorealroots!”

main()求一元二次方程的例子(ver2.0+)该程序两个if语句的流程图?做了基于同一个值的两次条件表达式的判断,不够高效二分支结构二分支结构语法:

if<condition>:

<statements1>

else:

<statements2>nextstatements#quadratic3.py考虑到负值并会给出提示importmathdefmain():print"Thisprogramfindstherealsolutions...\n"a,b,c=input("Pleaseenterthe...(a,b,c):")discrim=b*b-4*a*c

ifdiscrim<0:

print"\nTheequationhasnorealroots!"else:discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"\nThesolutionsare:",root1,root2

main()求一元二次方程的例子(ver3.0)ThisprogramfindstherealsolutionstoaquadraticPleaseenterthecoefficients(a,b,c):1,2,1

Thesolutionsare:-1.0-1.0

该程序还可以改善:同时<0、==0、>0三种情况ver3.0的运行结果§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计1单分支结构2二分支结构3多分支结构多分支结构ifdiscrim<0:print"Equationhasnorealroots"else:#大于等于0的情况ifdiscrim==0:root=-b/(2*a)print"Thereisadoublerootat",rootelse:#大于0的情况discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"\nThesolutionsare:",root1,root2if...else的嵌套:if或else后面的语句块可以是if…else语句多分支结构的实现1:if...else的嵌套教材p121:第13题程序设计:输入百分制的考试分数,输出相应的等级制名称。设A:90-100,B:80-89,C:70-79,D:60-69,F:60分以下多层嵌套会导致缩进很多多分支结构的实现2:elif语法:if<condition1>:

<case1statements>

elif<condition2>:

<case2statements>

elif<condition3>:

<case3statements>

else:

<defaultstatements><nextstatements>语义:

找到第一个为真的条件表达式并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句。#quadratic4.py同时考虑三种情况importmathdefmain():print"Thisprogramfindstherealsolutions...\n"a,b,c=input("Pleaseenterthe...(a,b,c):")discrim=b*b-4*a*c

ifdiscrim<0:print"\nTheequationhasnorealroots!"

elifdiscrim==0:root=-b/(2*a)print"\nThereisadoublerootat",root

else:discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"\nThesolutionsare:",root1,root2

求一元二次方程的例子(ver4.0)教材p121:第13题程序设计:输入百分制的考试分数,输出相应的等级制名称。设A:90-100,B:80-89,C:70-79,D:60-69,F:60分以下Boolean操作符有时候简单的bool表达式还不够用and、or、not等去组合多个布尔表达式

<条件表达式1>and<条件表达式2><条件表达式1>or<条件表达式2>not<条件表达式>布尔操作结果PQPandQPorQnotPTTTTFTFFTFFTFTTFFFFT我们可以用布尔操作符任意地组合各种布尔表达式。最终的结果还是T或F。Boolean操作符aornotbandc是T还是F(a,b,c皆为T)?操作符的优先级:not>and>or上述表达式等价于

(aor((notb)andc))在记不住优先级的时候,加小括号确定优先级写Bool表达式的例子:

模拟racquetball的结束两个人比赛,得分记为scoreA,scoreB,没分出胜负之前循环比赛,直到有一人胜出。循环的退出表达式怎么写?先得15分者胜(1)有一位得15分的表示scoreA==15orscoreB==15(2)满足上述条件的时候停止,否则继续比赛whilenot(scoreA==15orscoreB==15):#continueplaying只要满足一个条件就要退出取not的时候就是没退出,继续游戏例:模拟racquetball的结束先得15分或7:0者胜whilenot(a==15orb==15or(a==7andb==0)or(b==7anda==0))必须有一方大于15并且至少要多2分才胜whilenot((a>=15anda-b>=2)or(b>=15andb-a>=2))Boolean代数对布尔表达式的要求:

能写:将实际问题所涉及的条件表达成布尔表达式

能计算:能对布尔表达式进行演算和推导布尔表达式也能进行代数计算(布尔逻辑)Boolean代数andhaspropertiessimilarto*orhaspropertiessimilarto+0and1correspondtofalseandtrue,respectively.AlgebraBooleanalgebraa*0=0a

andfalse==falsea*1=aa

andtrue==aa+0=aa

orfalse==aBoolean代数任何数ortrue,其结果肯定为true:

aortrue==trueand和or服从分配律:

aor(bandc)==(aorb)and(aorc)

aand(borc)==(aandb)or(aandc)双重否定就是肯定:

not(nota)==a摩根定律:

not(aorb)==(nota)and(notb)

not(aandb)==(nota)or(notb)Python对布尔值和布尔运算的处理很灵活可扩展阅读

中文教材2.4.4Python中真假的表示与计算

§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计quadratic.py程序会产生很多问题quadratic2-4.py利用决策分支避免了其中的开方为负数时的运行错误在其他很多程序里,也经常用决策分支结构保护程序,避免出现虽然几率很小但还是不可避免会发生的错误。#quadratic.pyimportmathdefmain():print"Thisprogramfindsthereal..."a,b,c=input("Pleaseenter..(a,b,c):")

ifa==0:#非二次方程

handler1…

iftype(a)!=‘int’ortype(b)!=‘int’ortype(c)!=‘int’:#输入类型错误

handler2

…discRoot=math.sqrt(b*b-4*a*c)

ifdiscRoot<0:

handler3

…root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"Thesolutionsare:",root1,root2main()raw_input()

当程序中充斥着这样的错误检测代码时,解决问题的算法反而不明显了。

是不是可以把程序的主干留着,错误处理代码提出来放到专门的地方异常处理机制异常处理机制把错误集中在一起处理,以免影响算法的主线条。Python提供try...except...可使程序不因运行错误而崩溃,尽量让用户不受意外结果的困扰。异常处理语句语法:try:<mainbody>except<ErrorType1>:<handler1>except<ErrorType2>:<handler2>...except:<handlern>nextstatement语义:执行<body>。

若无错,控制转下一语句;

若有错,查找匹配该错误的except子句,找到则执行相应的处理程序,找不到则程序崩溃,系统报错。编程实例:完善quadratic.py用异常处理语句来捕获math.sqrt的溢出错误(quadratic5.py)try:...exceptValueError:...错误类型:从系统报错信息中可得。如ValueError,TypeError,NameError等Traceback(mostrecentcalllast):

File"C:\DocumentsandSettings\Terry\MyDocuments\Teaching\W04\CS120\Textbook\code\chapter3\quadratic.py",line21,in-toplevel-

main()

File"C:\DocumentsandSettings\Terry\MyDocuments\Teaching\W04\CS120\Textbook\code\chapter3\quadratic.py",line14,inmain

discRoot=math.sqrt(b*b-4*a*c)

ValueError:mathdomainerror#quadratic5.pyimportmathdefmain():print"Thisprogramfindstherealsolutions...\n"a,b,c=input("Pleaseenterthe...(a,b,c):")try:discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print"\nThesolutionsare:",root1,root2

exceptValueError:print"\nNorealroots“

exceptZeroDivisionError:

print“inputerror,acannotbezero."main()求一元二次方程的例子(ver5.0)将a等于0的判断也作为异常,使程序更加简洁运行程序ver5.0:

Thisprogramfindstherealsolutionstoaquadratic

Pleaseenterthecoefficients(a,b,c):1,1,1

Norealrootstry…except可以捕捉任何类型的错误,包括内置类型,自定义类型等。对于quadraticprogram,还会有其他的运行错误,如:输入非数值类型,输入非常量而是变量(NameError),输入无效的数值类型(TypeError)等。此时可以用一个try语句加多重except来实现。§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计(1)for循环:回顾

(2)while循环(3)常见循环模式

(4)循环的非正常中断for循环语法:for<var>in<sequence>:

<body>例子:foriinrange(100):printi语义:循环索引值var依次取sequence中的值,每循环一次执行一次<body>用for处理序列数据的两种遍历方式>>>data=['Bornon:','July',2,2005]直接遍历序列>>>fordindata:printd,通过索引遍历序列>>>foriinrange(len(data)):printdata[i],

可以更灵活地处理序列数据,如>>>foriinrange(0,len(data),3):...用for处理各种序列数据字符串>>>forcin"helloworld":printc,元组>>>foriin(1,2,3):printi

嵌套序列:如元组的列表>>>fortin[(1,2),(3,4),(5,6)]:printt,t[0],t[1]

(1,2)12(3,4)34(5,6)56123helloworld假设我们要求一组数的均值为了实现程序的通用性,必须使得该程序能够求任意个数的平均值程序特点:不要求记录每个值,只要求平均值,所以我们可以只记录加和值。for循环例子#average1.py#Aprogramtoaverageasetofnumbersdefmain():n=input("Howmanynumbersdoyouhave?")

sum=0.0foriinrange(n):x=input("Enteranumber>>")

sum=sum+xprint"\nTheaverageis",sum/nfor循环累积计算:(1)初始值的设定(2)循环计算,更新Howmanynumbersdoyouhave?5Enteranumber>>32Enteranumber>>45Enteranumber>>34Enteranumber>>76Enteranumber>>45Theaverageofthenumbersis46.4average1.py的缺点:需要用户输入n,不适合事先不知道n的场合不知道n则不能用确定的计数循环for不确定的条件循环:while上机课上交的作业问题:1、没交作业:915691689172919291949196920592162、存成了txt文件(9169,9175)3、没写成函数的形式(9197,9211)4、输出格式:%

上机课上交的作业问题:59%的应用printi,”$”+str("%0.2f“%principal)printi,“$%0.2f“%principal§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计(1)for循环:回顾

(2)while循环(3)常见循环模式

(4)循环的非正常中断语法:while<condition>:<body>nextstatement语义:只要条件成立就反复执行循环体;当条件不成立则执行下一条语句。不确定循环:whilewhile<condition>:

<body>条件表达式(condition)是一个bool型的表达式。语句体(body)是一句或多句语句,多句语句时缩进对齐。每次循环时,先检查条件表达式,为真时执行body,为假时略过body执行while后的语句,循环终止。不确定循环:whilewhile循环的特点循环前测试条件若不满足,则循环体一次都不执行循环体影响下一次条件测试否则导致无穷循环条件循环体yesno例如:要依次打印1-10这10个数:forloop:

foriinrange(1,11):

printiwhileloop:

i=1

whilei<=10:

printi

i=i+1while循环的特点两者有什么区别???(1)while需要对循环变量i进行初始化,而for循环的循环变量是自动处理的(2)while语句相对简单,但循环体一定要影响下一次条件测试试想,如果没有i=i+1这条语句,会发生什么事情?i一直为0,陷入死循环§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计(1)for循环:回顾

(2)while循环(3)常见循环模式

(4)循环的非正常中断(一)交互式循环

(二)哨兵循环(三)后测试循环(四)嵌套循环根据用户交互来决定是否循环下去求和例子(eg3_10.py):用户不断输入数据,程序得到数据后不断累加,最后算出输入数据的总和伪代码:

设置一个循环控制变量(moredata=yes/no)while(moredata为yes):

获得用户输入的数据

处理该数据

询问用户是否还要输入数据,即更新moredata的值

(一)交互式循环

#交互式循环的codesum=0#累积值赋初值moredata=“yes“#循环控制变量赋初值while(moredata[0]==“y”ormoredata[0]==“Y“):x=input("Inputanumber:")sum=sum+x

moredata=raw_input("More?(yes/no)")print"Thesumis",sum

(一)交互式循环

运行eg3_10.pyInputanumber:32More?(yes/no)yInputanumber:40More?(yes/no)yInputanumber:50More?(yes/no)yInputanumber:45More?(yes/no)nThesumis167优点:用户不用事先输入n缺点:用户会被没完没了的“y”的输入烦死改进:设置一个特殊数据值作为终止循环的信号。(二)哨兵循环(SentinelLoops)Asentinelloop

就是一直循环干事直到碰到一个特殊值。这个特殊值被称为哨兵(sentinel)。这个哨兵必须能很明确地和其它输入值分开。算法模式:前导输入while该数据不是哨兵:

处理该数据

循环尾输入(下一个数据)哨兵循环例(1)正常数据是非负数,则可以-1作为哨兵:eg3_11.pysum=0x=input("Inputanumber(-1toquit):")whilex>=0:sum=sum+xx=input("Inputanumber(-1toquit):")print"Thesumis",sum

哨兵循环例(2)正常数据是任何实数,则可以空串作为哨兵:eg3_12.pysum=0x=raw_input("Inputanumber(<Enter>toquit):")whilex!="":sum=sum+eval(x)x=raw_input("Inputanumber(<Enter>toquit):")print"Thesumis",sum

(三)后测试循环输入验证问题:检查用户输入是否符合要求,不符合就要求用户重新输入,直至符合为止。这是一种后测试循环:执行循环体后才测试条件循环体至少执行一次直至条件成立才退出循环有些语言提供repeat…until语句Python可用while实现只需确保首次进入while时条件成立x=1whilex<0:...例如,假设程序要求用户输入一个正数,则用下面代码片段可检查输入合法性:x=-1whilex<0:x=input(“pleaseinputapositivenumber:”)(四)嵌套循环(NestedLoops)分支结构能够嵌套,循环结构也能嵌套——一个循环语句体内可以是循环语句。如果序列的成员本身又是序列,就需要嵌套循环来处理。数学中向量是一维序列,矩阵是二维序列(四)嵌套循环(NestedLoops)用嵌套循环遍历矩阵元素:a=[[11,12],[21,22],[31,32]]sum=0foriina:

forjini:sum=sum+jprintsumsum=0foriina:

forjini:sum=sum+j

printsum,sum=0foriina:

forjini:sum=sum+j

printsum,嵌套循环例打印乘法口诀表关键是输出的排列>>>foriinrange(1,10):forjinrange(1,i+1):print"%dx%d=%-2d"%(j,i,j*i),print1x1=11x2=22x2=41x3=32x3=63x3=91x4=42x4=83x4=124x4=161x5=52x5=103x5=154x5=205x5=251x6=62x6=123x6=184x6=245x6=306x6=361x7=72x7=143x7=214x7=285x7=356x7=427x7=491x8=82x8=163x8=244x8=325x8=406x8=487x8=568x8=641x9=92x9=183x9=274x9=365x9=456x9=547x9=638x9=729x9=81§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计(1)for循环:回顾

(2)while循环(3)常见循环模式

(4)循环的非正常中断正常的循环总是按“从头到尾再回到头”的方式进行,但是很多编程语言都提供了特定条件下打破正常循环方式的语句,便于解决问题。Python:break和continue循环的非正常中断循环非正常中断:break语义:中止本轮循环,结束break所处的循环语句。常与whileTrue形式的无穷循环配合使用例1:输入合法性检查whileTrue:x=input("请输入非负数:")ifx>=0:break例2:break也可以跳出for循环foriinrange(10):print"烦"ifi>4:break循环非正常中断:continue语义:中止本轮循环,控制转移到所处循环语句的开头“继续”下一轮循环。例:对列表中的奇数求和a=[23,28,39,44,50,67,99]sum=0foriina:ifa%2==0:continuesum=sum+iprintsumforiinrange(10):print"烦"ifi>4:continueforiinrange(10):ifi>4:continueprint"烦"foriinrange(10):ifi==4:breakprint"烦"foriinrange(10):ifi==4:continueprint"烦"烦烦烦烦烦烦烦烦烦烦烦烦烦§3.2分支结构§3.3异常处理§3.4循环结构§3.5结构化程序设计程序设计的发展早期:手工作坊式程序规模小,功能简单要在有限内存中尽快完成计算凭借程序员的个人编程技巧后来:作为工程来开发程序规模大,功能复杂内存和速度不是问题,软件可靠性和开发效率变得突出依靠系统化的开发方法和工具程序开发的周期Step1、需求分析:我们要解决什么问题?分析的越仔细越好。Step2、制定程序规格:

程序要做什么?主要关注能完成什么,而非程序怎么运行。例如,对于简单程序,我们只要描述输入输出,然后看他们是怎么关联的即可。Step3、算法设计:描述怎么做。阐明程序的整个框架结构。考虑程序如何运行,设计适合于上述规格的算法。一般用伪代码给出总体结构,不纠缠细节。Step4、算法实现:用某种程序设计语言编写代码。Step5、测试与排错:测试程序是否如预期,排除bug(debug)。Step6、维护程序:运行中还会不断有问题,如持续开发、程序的改进等。什么是好的程序解决同一个问题,可以设计出多种处理过程,即编制多种程序。即使各种程序都正确。仍然有好坏之分。除了正确性,好的程序应该是:效率高易理解易维护可扩展如何得到好的程序手工作坊阶段靠的是个人编程技巧如今则要善于依靠程序设计方法和工具方法:结构化方法,模块化方法,面向对象方法等工具:建模工具,集成开发环境等编程案例:求最大值(1)考虑求三个数x1,x2,x3的最大值的问题策略1:每个数都与其他数比较大小ifx1>=x2andx1>=x3:max=x1elifx2>=x1andx2>=x3:max=x2else:max=x3此算法中各分支彼此独立。但实际上一个分支的信息对其他分支是有用的!此算法不适合较大n的情况编程案例:求最大值(2)策略2:判定树ifx1>=x2:

ifx1>=x3:max=x1else:max=x3else:ifx2>=x3:max=x2else:max=x3好处:只需两次比较,效率高.坏处:结构复杂,复杂度随n爆炸式增长.编程案例:求最大值(3)策略3:顺序处理,记录当前最大值。max=x1ifx2>=max:max=x

温馨提示

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

评论

0/150

提交评论