您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > Python > Python-教程-chapter8
控制结构循环语句2for循环:回顾语法forvarinsequence:body语义–循环标志变量var取遍序列sequence中的每个值;(该循环自动改变var的值)–对var所取的每个值执行一遍循环体body计数循环循环次数是确定的,即序列的长度决定3编程实例:求平均值需求:输入若干个数,求平均值.显然可用熟悉的累积器算法模式算法:输入数值个数n初始化累积变量sum=0循环n次输入数值x累加到sum输出平均值sum/n翻译到Python:avg1.py4while循环avg1.py的缺点:需要用户输入n–不适合事先不知道n的场合不知道n则不能用确定的计数循环for不确定的条件循环:while5while循环语法whilecondition:body语义–只要条件成立就反复执行循环体;–当条件不成立则执行下一条语句6while循环的特点循环前测试条件(pre-test)–若不满足,则循环体一次都不执行循环体影响下一次条件测试–否则导致无穷循环–例如:for循环改写成while循环i=0#编程者设置whilei10:printii=i+1#编程者设置若忘了最后一条语句会怎样?条件循环体yesno7常见循环模式:交互循环用户根据需要来循环执行程序某一部分例如:avg2.py–不输入n,由程序自己数输入的值的个数–设置一个是否继续循环的标志初始化sum=0#求和初始化count=0#记录数据的个数初始化moredata=yeswhilemoredata=yes:输入数据x累积sum=sum+x累积count=count+1询问用户moredata?输出平均值sum/count8常见循环模式:哨兵循环avg2.py不断要用户输入moredata,很烦人.改进:设置一个特殊数据值(称为哨兵)作为终止循环的信号–对哨兵唯一的要求就是能与普通数据区分9常见循环模式:哨兵循环模式输入第一个数据while该数据不是哨兵:处理该数据输入下一个数据编程实例:avg3.py(负数哨兵)(数据中有负数则无效)avg4.py(空串哨兵)10常见循环模式:文件循环avg1~avg4都是交互式输入数据的–不便处理大数据量–一个输入错误即导致需要重新运行程序改进:建立一个数据文件–数据处理应用中广泛使用模式:打开数据文件fforlineinf.readlines():处理每个数据编程实例:avg5.py11常见循环模式:EOF哨兵循环一次性读入–readlines()一次性把文件的所有行都读入内存–但内存是很有限的!可能无法运行分批读入(缓存)–readline()每次读入一行–需要哨兵(如:空行),标志文件结束(EOF)line=f.readline()whileline!=“”:处理该行line=f.readline()–编程实例:avg6.py12常见循环模式:嵌套循环嵌套循环:一个循环语句的循环体内有另一个循环语句用途:遍历一维空间的元素只需一个循环变量,遍历二维空间的元素需要两个循环变量,……,遍历n维空间的元素需要n个循环变量如:矩阵foriinrange(10):forjinrange(20):printx[i][j]13常见循环模式:嵌套循环例如:假设数据文件的每一行有多个数据.编程实例:avg7.py–顶层循环仍如avg6.py–但每次顶层循环内,需要另一个循环来处理该行上的多个数据14布尔值计算布尔表达式:以True/False为值简单布尔表达式:exprrelopexpr–关系运算(relop):,=,==,=,,!=–数值比较–字符串比较:按字典序字母序由编码(ASCII等)决定.如:大写字母在小写字母前15布尔值计算复杂布尔表达式:由布尔表达式及布尔运算构成–布尔运算(逻辑联结词)二元运算:and,or(并且,或者)布尔exprand布尔expr布尔expror布尔expr一元运算:not(非)not布尔expr16and的定义and表示“并且”:PandQ为真iffP和Q都为真–用真值表表示更直观PQPandQFFFFTFTFFTTT17or的定义or表示“或者”:PorQ为假iffP和Q都为假PQPorQFFFFTTTFTTTT18or的定义or表示“或者”:PorQ为假iffP和Q都为假“可兼或”:or这次演出,我或者跳舞,或者唱歌“不可兼或”:互斥的涵义,即二选一我今天晚上或者在家看电视,或者到体育场看球赛。19not的定义not表示“否定”:notP为真iffP为假.PnotPTFFT20布尔运算符的优先级not最高,and次之,or最低–思考:aornotbandc何意?–最好使用括号!21例:判断两点是否位置相同嵌套if-elseifp1.getX()==p2.getX():ifp1.getY()==p2.getY():#pointsarethesameelse:#pointsaredifferentelse:#pointsaredifferent用布尔运算符ifp1.getX()==p2.getX()andp1.getY()==p2.getY():#pointsarethesameelse:#pointsaredifferent22例:模拟racquetball的结束用计算机模拟自然现象,分析可能的结果先得15分者胜whilenot(scoreA==15orscoreB==15):#这里用not(and)#continueplaying先得15分或7:0者胜a==15orb==15or(a==7andb==0)or(b==7anda==0)至少要多2分才胜(a=15anda-b=2)or(b=15andb-a=2)或(a=15orb=15)andabs(a-b)=223布尔代数布尔运算遵循的代数定律aandFalse==False(零律)aandTrue==a(同一律)aorFalse==a(同一律)aorTrue==True(零律)24布尔代数布尔运算遵循的代数定律分配率aor(bandc)==(aorb)and(aorc)aand(borc)==(aandb)or(aandc)双重否定not(nota)==a摩根律not(aorb)==(nota)and(notb)not(aandb)==(nota)or(notb)25利用布尔代数简化条件例如:racquetball结束条件whilenot(scoreA==15orscoreB==15):#continueplayingwhile(notscoreA==15)and(notscoreB==15):#continueplayingwhilescoreA!=15andscoreB!=15:#continueplaying26其他循环结构:后测试循环问题:输入验证–检查用户输入是否符合要求,不符合就要求用户重新输入,直至符合为止这是一种后测试循环:–执行循环体后才测试条件–循环体至少执行一次–直至条件成立才退出循环–有些语言提供repeat…until语句27其他循环结构:后测试循环Python未提供专门语句–但可用while实现,只需确保首次进入while时条件成立x=1whilex0:…28break语句语法:break语义:退出break所处循环(通常是无穷循环)应用例:实现后测试循环while1:x=input(Enteranonnegativenumber:)ifx=0:break……两种希望:(1)本次循环到此为止,进入下次循环--continue(2)结束循环,退出循环体--break29break语句比用一个非法值(如前面的1)来强制while循环一次的做法好.试一试:为两种做法都加一句数据错误报警信息慎用break(非正常控制流,破坏了程序结构)尤其是一个循环体用多个break出口作用和某些程序语言中的goto语句类似30LoopandaHalf半路循环、半途退出问题循环出口在循环体中间.例如while1:x=input(Enteranonnegativenumber:)ifx=0:breakprintnegative!实现哨兵循环:while1:读取下一数据xifx是哨兵:break处理x31布尔表达式用作控制结构Python2.7具有内建bool类型–只有两个值:True和False–此前版本用整数1和0Python的其他任何内建类型都可解释为布尔值–非0整/浮点/长整数解释为True0解释为False–非空字符串解释为True空串解释为False32布尔表达式用作控制结构布尔运算符的操作语义(计算顺序)xandy:若x为假,返回x;否则返回yxory:若x为假,返回y;否则返回xnotx:若x为假,返回1;否则返回0–符合布尔逻辑–走捷径33例:Python布尔运算的陷阱期待用户输入y或Y的代码:whileans=='y'orans=='Y':…不能写成whileans=='y'or'Y':…–因为后者总是计算到True!(Why?)34例:Python布尔运算的灵活性期待用户输入,若无输入则赋予缺省值的代码:ans=raw_input(Whatflavor[vanilla]?)ifans!=:flavor=anselse:flavor=vanillaans=raw_input(Whatflavor[vanilla]?)ifans:flavor=anselse:flavor=vanillaans=raw_input(Whatflavor[vanilla]?)flavor=ansorvanillaflavor=raw_input(Whatflavor[vanilla]?)orvanilla35作业EX8.6P1348,1036上机总结4-18题,wordcount主要代码:lines=file.readlines()linecount=len(lines)wordcount=0charcount=0forlineinlines:words=string.split(line)wordcount+=len(words)forwordinwords:charcount+=len(word)printlinecount,wordcount,charcount37上机5-12题,矩形的周长和面积:求周长和面积前,对矩形的长和宽求绝对值,长和宽总是大于0的。38作业7.6.15题判断闰年:用7.6.13题给的提示,(year%4==0andyear%100!=0)or(year%400==0)验证日期:验证月份可以使用一个月份天数的二维列表months=[[0,31,28,31,30,31,30,31,31,30,31,30,31],[0,31,29,31,30,31,30,31,31,30,31,30,31]],然后验证0day=months[IsLeapYear][month]就可以了。39End40真值表(notP)andQPQnotP(notP)andQFFTFFTTTTFFFTTFF
本文标题:Python-教程-chapter8
链接地址:https://www.777doc.com/doc-3942985 .html