控制结构条件语句222单分支决策语法ifcondition:body–condition:布尔表达式–body:语句序列语义:计算condition的真假–若为真,则执行body,并把控制转向下一条语句;–若为假,则直接把控制转向下一条语句33条件表达式condition是一个表达式,称为布尔表达式–结果为True/False(type:boolean)有些语言用0表示false,用1或非零值表示真.44条件表达式简单条件:比较两个表达式expr1rel-opexpr2–关系运算:,=,==(等于,=赋值),=,,!=–数值比较–字符串比较:按字典序字母序由编码(ASCII等)决定.如:大写字母在小写字母前.复杂条件:详见后555编程实例:有条件执行程序回顾:Python模块分为–程序/脚本:可直接执行–库:不能直接执行666编程实例:有条件执行程序回顾:Python模块分为–程序/脚本:可直接执行模块最后一行是main(),即启动程序的语句执行方式–直接执行Windows下双击模块图标DOS命令行下:pythonmyfile.py–在会话或其他程序中import并执行–库:不能直接执行777编程实例:有条件执行程序回顾:Python模块分为–程序/脚本:可直接执行–库:不能直接执行模块中没有main()一行被其他程序import但不执行888编程实例:有条件执行程序(续)混合型模块:既能作为独立程序直接执行,又能作为库被其他程序import而不执行.例如:graphics.py#myfile.pydefmain():…defother():…if__name__==‘__main__’:main()•import一个模块时,Python将该模块中的一个特殊变量__name__设置为该模块的名字;•直接执行模块时,__name__被设置为’__main__’两分支决策语法if条件:语句序列1else:语句序列2语义–若条件为真,执行语句序列1,控制转向下一条语句;–否则执行语句序列2,控制转向下一条语句9编程实例:完善quadratic.pyquadratic会产生运行错误–(b2-4ac0)时,程序崩溃quadratic2:增加条件ifdiscrim=0:…–仍不好:未告知用户无解的情况10编程实例:完善quadratic.pyquadratic3a:增加条件ifdiscrim=0:…ifdiscrim0:…Quadratic3b:增加条件ifdiscrim=0:…else:…11多分支决策语法if条件1:语句序列1elif条件2:语句序列2...elif条件n语句序列nelse缺省语句序列12多分支决策语义:–找到第一个为真的条件并执行对应语句序列,控制转向下一条语句;–若无,则执行else下的语句序列,控制转向下一条语句13编程实例:完善quadratic.pyquadratic3:未考虑重根情形,即应区分判别式0,=0,0三种情形.–解决方法一:用嵌套if-elseifdiscrim0:else:ifdiscrim=0:else:对三分支尚可,但对更多分支不是好方法.14编程实例:完善quadratic.pyquadratic3:未考虑重根情形,即应区分判别式0,=0,0三种情形.–解决方法一:用嵌套if-else–解决方法二:用if-elif-elsequadratic4.py15程序运行错误的处理常见代码:利用if判断某种运行错误是否发生do_sth()ifsome_error:do_sth_else()16程序运行错误的处理有的函数利用返回特殊值来表示某种运行错误发生–例如:设计otherSqrt(),若无平方根返回-1.ifotherSqrt(b*b4*a*c)0:17例外处理程序设计问题:当程序中充斥着这样的错误检测代码时,解决问题的算法反而不明显了解决办法:例外处理机制–程序员编写捕获并处理运行时错误的代码,而不是在每一步都去检测–Python提供try...except...–可使程序不因运行错误而崩溃,尽量让用户不受意外结果的困扰18例外处理语句语法try:bodyexceptErrorType1:handler1exceptErrorType2:handler2...except:...19例外处理语句语义:–执行body–若无错,控制转try…except后面的下一语句;–若有错,查找匹配该错误的except子句,找到则执行相应的处理程序找不到则程序崩溃,系统报错说明:例外,不一定是错误。有的时候是需要特别处理的事件。raiseMyExp20编程实例:完善quadratic.py用例外处理语句来捕获math.sqrt的溢出错误(quadratic5.py)try:...exceptValueError:...错误类型:从系统报错信息中可得–如ValueError,TypeError,NameError等对quadratic进一步完善为可捕获各种错误类型(quadratic6.py)21编程实例:求三数之最大者设计策略1:每个数都与其他所有数比较if?:max=x1elif?:max=x2elif?:max=x322x1=x2=x3行吗?注:Python确实允许这种形式的比较!编程实例:求三数之最大者写条件时要问自己两个问题,即“当且仅当”–条件真时,相应语句序列是所需的吗?注意临界值–每当语句序列是所需的,条件总为真吗?比较容易出错例如:凡是x1最大的时候,这个语句都执行吗?23编程实例:求三数之最大者设计策略1:每个数都与其他所有数比较if?:max=x1elif?:max=x2elif?:max=x3条件真时,相应语句序列是所需的吗?每当语句序列是所需的,条件总为真吗?24x1=x2=x3行吗?注:Python确实允许这种形式的比较!是否!编程实例:求三数之最大者(续)语句max=x1实际只需要条件x1=x2和x1=x3,而不管x2与x3大小如何ifx1=x2andx1=x3:max=x1elifx2=x1andx2=x3:max=x2else:max=x325编程实例:求三数之最大者(续)此法中,各分支彼此独立,但实际上一个分支的信息对其他分支是有用的!–如:x1=x2,x1=x3时对更多数据的比较,此法不好–需要更多的布尔表达式,而且更复杂26编程实例:求三数之最大者(续)27好处:只需两次比较,效率高.坏处:结构复杂,复杂度随n爆炸式增长(指数级)编程实例:求三数之最大者(续)设计策略2:判定树ifx1=x2:ifx1=x3:max=x1else:max=x3else:ifx2=x3:max=x2else:max=x328编程实例:求三数之最大者(续)设计策略3:顺序处理,记录当前最大值.–设计算法时的一个好的起点:问自己会如何做?当n=100时你会如何找出最大值?(选个大苹果)max=x1ifx2=max:max=x2ifx3=max:max=x3效率高(时间复杂度:线性(多项式级))易读可扩展:maxn.py29编程实例:求三数之最大者(续)设计策略4:利用Python–内部函数max(x1,x2,...,xn)defmain():x1,x2,x3=input(“enter3numbers:“)print“themaxis”,max(x1,x2,x3)30编程实例:求三数之最大者(续)经验小结–给定问题,有多种解决方法不要只凭第一反应去匆忙编程,要三思首先要算法正确,然后要简单,清晰,高效,可扩展,漂亮.–问自己会如何解决问题–追求一般性–借用现成算法(站在巨人的肩膀上)31作业EX7.6(P116)153333End