1of39第第33讲讲流程控制流程控制刘祖根2015-10-20计算机导论-Python语言2of39掌握流程控制的概念掌握条件语句¾单分支结构¾两路分支¾多路分支掌握循环语句¾for循环¾While循环养成良好的编程习惯和风格目标3of39数据是被加工处理的原材料,而处理过程要用流程控制结构来描述¾类比:烹调=食材+烹制过程9烹制过程:先炒再煮;如果淡了则加盐;反复翻炒5分钟;...常见的流程控制结构¾顺序,跳转,分支,循环,子程序等好的流程:结构清晰,易理解,易验证,易维护所有的程序都可以由顺序、分支和循环结构构成流程控制4of39按语句的自然先后顺序执行流程图:用标准化的图形符号来表示程序步骤¾流程图中的步骤可以是不同抽象级的¾例:温度转换程序:华氏转换成摄氏顺序控制结构f=input(TemperatureindegreesFarenheit:)c=(f–32)*5.0/9printTemperatureindegreesCelsius:,c5of39可以选择不同的执行路径单分支结构ifif条件条件::语句体语句体¾条件:布尔表达式¾语句体:语句序列9左边需要“缩进”一些空格(或者Tab).语义:计算条件的真假.若为真,则执行语句体,并把控制转向下一条语句;若为假,则直接把控制转向下一条语句.分支控制结构条件语句体入口出口条件表达式TrueFalse6of39布尔表达式¾表达式1关系运算符表达式2¾关系操作符:,,=,=,==,!=¾例如,x5,y!=32布尔逻辑运算¾布尔表达式1布尔运算符布尔表达式2¾布尔运算符:and,or,not9优先级:not最高,and次之,or最低–aornotbandc等价于aor((notb)andc)¾例如:9x0andx59n%2==0orn%3==0,9not(xy)布尔表达式与布尔逻辑运算7of39双方任何人先得11分a==11orb==11更准确的:一方至少要多2分才胜(a=11anda-b=2)or(b=11andb-a=2)或者写成(a=11orb=11)andabs(a-b)=2例:一局乒乓球比赛的结束8of39温度转换程序:¾增加热浪告警功能f=input(TemperatureindegreesFarenheit:)c=(f–32)*5.0/9printTemperatureindegreesCelsius:,cifc35:printWarning:HeatWave!单分支编程实例(1)注意:冒号注意:缩进9of39温度转换程序:¾增加热浪和寒潮告警功能f=input(TemperatureindegreesFarenheit:)c=(f–32)*5.0/9printTemperatureindegreesCelsius:,cifc=35:printWarning:HeatWave!ifc=-6:printWarning:ColdWave!单分支编程实例(2)10of39语法ifif条件条件::ifif--语句体语句体else:else:elseelse--语句体语句体if和else是非此即彼的关系.¾下列语句对吗?ifc=35:printWarning:HeatWave!else:printWarning:ColdWave!两路分支结构11of39if语句可以嵌套¾多重嵌套不好9难读9代码松散9向右缩进占空间ifc=35:printWarning:HeatWave!else:ifc=-6:printWarning:ColdWave!else:printHavefun!多路分支:嵌套if-elseelse与后续if合并形成elif子句c35-6c3512of39语法ifif条件条件1:1:情形情形11语句语句体体elifelif条件条件2:2:情形情形22语句体语句体......elifelif条件条件nn情形情形nn语句语句体体elseelse其他情形其他情形语句语句体体语义:找到第一个为真的条件并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句。多路分支:if-elif-else结构else子句可选13of39温度转换程序f=input(TemperatureindegreesFarenheit:)c=(f-32)*5.0/9printTemperatureindegreesCelsius:,cifc=35:printWarning:HeatWave!elifc=-6:printWarning:ColdWave!else:printHavefun!多路分支编程实例14of39有时需要重复做相同或相似的事情¾例如:如果水壶没冒蒸汽,继续加热水壶程序中如何表达重复?¾例如:在屏幕上显示1~5print1print2print3print4print5¾繁琐且不具有扩展性(显示1~10000怎么办?)循环:用很少的语句表达重复执行的很多语句.循环控制结构:为什么?15of39语法forfor循环控制变量循环控制变量inin序列序列::循环体循环体语义:令循环控制变量取遍序列中的每个值,并对变量所取的每个值执行一遍循环体.例如:foriin[1,2,3,4,5]:printi¾显示1~10000:9用[1,2,...,10000]显然不合适,可以用range()for循环注意:缩进16of39for循环的流程图17of39计数器:序列只是用来控制循环的次数.foriinrange(10):print烦¾循环体不引用循环变量.数据:序列本身是循环体处理的数据.foriinrange(10):printi*i¾循环体引用循环变量.¾两种遍历方式(见下一片)for语句中序列序列的作用18of39直接遍历序列data=['Bornon:','July',2,2005]fordindata:printd,通过索引遍历序列data=['Bornon:','July',2,2005]foriinrange(len(data)):printdata[i],¾可以更灵活地处理序列数据,如foriinrange(0,len(data),3):...用for处理序列数据注意:使print不换行19of39例如:data=[1,2,3,4,5]forxindata:x=x+1data[1,2,3,4,5]x6☆循环体中修改的是循环控制变量x,而非列表data。遍历列表的同时修改列表data=[1,2,3,4,5]foriinrange(len(data)):data[i]=data[i]+1data[2,3,4,5,6]i420of39字符串forcinhelloworld:printc元组foriin(1,2,3):printi嵌套序列:如元组的列表fortin[(1,2),(3,4),(5,6)]:printt,t[0],t[1]多个循环控制变量构成元组for(x,y)in[(1,2),(3,4),(5,6)]:printx,y用for处理各种序列数据21of39for主要用于确定次数的循环不确定次数的循环:whilewhilewhile布尔表达式布尔表达式::循环体循环体☆语义:当布尔表达式计算结果为True时,执行一遍循环体,执行完毕控制转回while语句开始处重新测试布尔表达式;当布尔表达式计算结果为False,控制转向下一条语句。while循环循环次数取决于测试条件何时变为False22of39循环前测试条件¾若不满足,则循环体一次都不执行循环体必须影响下一次条件测试!¾否则导致无穷循环¾例如:for循环改写成while循环i=0whilei10:printii=i+19若忘了最后一条语句会怎样?while循环的特点23of39根据用户交互来决定是否循环下去例:输入n个数求和¾输入———累加sum=0moredata=yeswhilemoredata[0]==y:x=input(Inputanumber:)sum=sum+xmoredata=raw_input(More?(yes/no))printThesumis,sum常用循环模式:交互循环24of39交互循环不断要用户输入moredata,很烦人.改进:设置一个特殊数据值(称为哨兵哨兵)作为终止循环的信号.¾对哨兵唯一的要求就是能与普通数据区分算法模式:前导输入while该数据不是哨兵:处理该数据循环尾输入(下一个数据)常用循环模式:哨兵循环25of39若正常数据是非负数,则可以-1作为哨兵:sum=0x=input(Inputanumber(-1toquit):)whilex=0:sum=sum+xx=input(Inputanumber(-1toquit):)printThesumis,sum哨兵循环例(1)26of39若正常数据是任何实数,则可以空串作为哨兵:sum=0x=raw_input(Inputanumber(Entertoquit):)whilex!=:sum=sum+eval(x)x=raw_input(Inputanumber(Entertoquit):)printThesumis,sum哨兵循环例(2)27of39用while实现计数器循环计数器count置为0whilecountn:处理代码count=count+1用while实现软件延迟printStart!timer=10000000whiletimer0:timer=timer-1printTimeisup!常用循环模式:while计数器循环i=0whilei10:printii=i+1i=10whilei0:printii=i-128of39立即结束break所在循环语句.¾常与whileTrue形式的无穷循环无穷循环配合使用例1:输入合法性检查whileTrue:x=input(请输入非负数:)ifx=0:break例2:break也可以跳出for循环foriinrange(10):print烦ifi4:break循环非正常中断:break29of39中止本轮循环本轮循环,控制转移到所处循环语句的开头继续继续下一轮循环.例:对列表中的奇数求和a=[23,28,39,44,50,67,99]sum=0foriina:ifa%2==0:continuesum=sum+iprintsum循环非正常中断:continue30of39一个循环的循环体中有另一个循环.如果序列的成员本身又是序列,就需要嵌套循环来处理.¾数学中向量是一维序列,矩阵是二维序列用嵌套循环遍历矩阵元素:a=[[11,12,13,14],[21,22,23,24],[31,32,33,34]]sum=0foriina:forjini:sum=sum+jprintsum常用循环模式:嵌套循环行列31of39打印乘法口诀表¾内循环的循环次数要根据外循环控制变量值做相应调整¾关键是输出的排列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