yhon函数设计与异常_第1页
yhon函数设计与异常_第2页
yhon函数设计与异常_第3页
yhon函数设计与异常_第4页
yhon函数设计与异常_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

Python函数设计和异常汇报人:付红玉汇报时间:2018年5月一函数设计与使用1“”Python函数将可能需要反复执行的代码封装为函数,并在需要执行该段代码功能的地方进行调用,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用位置均得到体现。在编写函数时,有很多原则需要参考和遵守:1、不要在同一个函数中执行太多的功能,尽量只让其完成一个高度相关且大小合适的功能,以提高模块的内聚性。2、尽量减少不同函数之间的隐式耦合,例如减少全局变量的使用,使得函数之间仅通过调用和参数传递来显式体现其相互关系。2函数定义

函数定义语法:def函数名([参数列表]):

'''注释'''

函数体函数形参不需要声明类型,也不需要指定函数返回值类型即使该函数不需要接收任何参数,也必须保留一对空的圆括号括号后面的冒号必不可少函数体相对于def关键字必须保持一定的空格缩进Python允许嵌套定义函数注意事项√√√√√3函数定义格式生成斐波那契数列的函数定义和调用:调用函数1000是实参n是形参deffib(n):a,b=1,1whilea<n:print(a,end='')a,b=b,a+bprint()fib(1000)定义头函数体4函数的注释在定义函数时,开头部分的注释并不是必需的,但如果为函数的定义加上注释的话,可以为用户提供友好的提示.5函数对象的增加、删除Python是一种高级动态编程语言,变量类型是随时可以改变的。Python中的函数和自定义对象的成员也是可以随时发生改变的,可以为函数和自定义对象动态增加新成员。>>>deffunc():print(func.x)#查看func的成员>>>func()#现在函数func还没有成员x,出错AttributeError:'function'objecthasnoattribute'x‘>>>func.x=3#动态为函数增加新成员>>>func()3>>>delfunc.x#删除成员>>>func()#删除之后不可访问AttributeError:'function'objecthasnoattribute'x‘6函数的递归调用函数的递归调用是函数调用的一种情况,函数调用自己,自己再调用自己,自己再调用自己,…,当某个条件得到满足的时候,就不再调用了,然后再一层一层地返回知道该函数第一次调用的位置需要用栈来存储该函数离开的位置,栈比较小,如果递归调用很深,则导致栈崩溃7尾递归尾递归是指:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。8递归实现n的阶乘:deffact(n):ifn==1:return1returnn*fact(n-1)deffact(n):returnfact_iter(n,1)deffact_iter(num,product):ifnum==1:returnproductreturnfact_iter(num-1,num*product)改成尾递归returnfact_iter(num-1,num*product)仅返回递归函数本身num-1和num*product在函数调用前就会被计算,不影响函数调用遗憾的是:大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出010203在Python中,定义函数时不需要声明函数的返回值类型,而是使用return语句结束函数的执行的同时返回任意类型的值,函数返回值类型与return语句返回表达式的类型一致。如果函数没有return语句或者执行了不返回任何值的return语句,Python将认为该函数以returnNone结束,即返回空值函数基本语法9不论return语句出现在函数的什么位置,一旦得到执行将直接结束函数的执行。函数参数数不得不不说的几几件事((一)1)在定义函函数时,对参数数个数并并没有限限制,如如果有多多个形参参,则需要使使用逗号号进行分分隔.下下面的函函数用来来接收2个参数数,并输出其其中的最最大值:defprintMax(a,b):ifa>b:pirnt(a,'isthemax')else:print(b,'isthemax')2)对于绝大大多数情情况下,在函数数内部直直接修改改形参的的值不会会影响实实参:>>>defaddOne(a):print(a)#输出原变变量a的的值a+=1#这条语句句会得到到一个新新的变量量aprint(a)>>>a=3>>>addOne(a)34>>>a310函数参数数不得不不说的几几件事((二)在有些情情况下,,可以通通过特殊殊的方式式在函数数内部修修改实参参的值。>>>defmodify(v):#修改列表元素素值v[0]=v[0]+1>>>a=[2]>>>modify(a)>>>a[3]>>>defmodify(v,item):#为列表表增加元素v.append(item)>>>a=[2]>>>modify(a,3)>>>a[2,3]>>>defmodify(d):#修改字典元素值或或为字典增加元素素d['age']=38>>>a={'name':'Dong','age':37,'sex':'Male'}>>>a{'age':37,'name':'Dong','sex':'Male'}>>>modify(a)>>>a{'age':38,'name':'Dong','sex':'Male'}11函数参数数不得不不说的几几件事((三)默认值参参数在调用带带有默认认值参数数的函数数时,可可以不用用为设置置了默认认值的形形参进行行传值,,此时函函数将会会直接使使用函数数定义时时设置的的默认值值,也可可以通过过显式赋赋值来替替换其默默认值。def函函数名名(………,形参参名=默默认值):函数体可以使用用“函数名名.__defaults__”随时查看看函数所所有默认认值参数数的当前前值,其返回值值为一个个元组,其中的的元素依依次表示示每个默默认值参参数的当当前值。。>>>defsay(message,times=1):print((message+'')*times)>>>say.__defaults__(1,)注意:函数参数数的默认认值是在在定义函函数时确确定的12函数参数数不得不不说的几几件事((四)(2)关键键参数通过关键键参数可可以按参参数名字字传递值值,实参顺序序可以和和形参顺顺序不一一致,但不影影响参数数值的传传递结果果,避免免了用户户需要牢牢记参数数位置和和顺序的的麻烦,,使得函函数的调调用和参参数传递递更加灵灵活方便便。>>>defdemo(a,b,c=5):print(a,b,c)>>>demo(c=8,a=9,b=0)90813函数参参数不不得不不说的的几件件事((五))(3))可变变长度度参数数可变长长度参参数在在定义义函数数时主主要有有两种种形式式:*parameter和和**parameter,,前者者用来来接收收任意意多个个实参参并将将其放放在一一个元组中,后后者接接收类类似于于关键键参数数一样样显式式赋值值形式式的多多个实实参并并将其其放入入字典中。第一种种形式式可变变长度度参数数的用用法,,无论论调用用该函函数时时传递递了多多少实实参,,一律律将其其放入入元组组中::>>>defdemo(*p):print(p)>>>demo(1,2,3,4,5,6,7)(1,2,3,4,5,6,7)第二种形式式可变变长度度参数数的用用法:>>>defdemo(**p):foriteminp.items():print(item)>>>demo(x=1,y=2,z=3)('y',2)('x',1)('z',3)14函数参参数不不得不不说的的几件件事((六))传递参参数时时的序序列解解包>>>defdemo(a,b,c):print(a+b+c)>>>seq=[1,2,3]>>>demo(*seq)6>>>tup=(1,2,3)>>>demo(*tup)6>>>dic={1:'a',2:'b',3:'c'}>>>demo(*dic)6>>>Set={1,2,3}>>>demo(*Set)6>>>demo(*dic.values())abc15Key作为实实参函数参参数不不得不不说的的几件件事((七))注意::调用函函数时时如果果对实实参使使用一一个星星号*进行行序列列解包包,这这么这这些解解包后后的实实参将将会被被当做做普通通位置置参数数对待待,并并且会会在关关键参参数和和使用用两个个星号号**进行行序列列解包包的参参数之之前进进行处处理。。>>>defdemo(a,b,c):#定义函函数print(a,b,c)>>>demo(a=1,*(2,3))#序列解解包相相当于于位置置参数数,优优先处处理Traceback(mostrecentcalllast):File"<pyshell#26>",line1,in<module>demo(a=1,*(2,3))TypeError:demo()gotmultiplevaluesforargument'a'>>>demo(c=1,*(2,3))231>>>demo(**{'a':1,'b':2},*(3,))#序列解解包不不能在在关键键参数数解包包之后后SyntaxError:iterableargumentunpackingfollowskeywordargumentunpacking>>>demo(*(3,),**{'c':1,'b':2})32116参数检检查调用函函数时时,如如果参参数个个数不不对,,Python解释器器会自自动检检查出出来,,并抛抛出TypeError:17defmy_abs(x):ifx>=0:returnxelse:return-x>>>my_abs(1,2)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:my_abs()takes1positionalargumentbut2weregiven如果参数类类型不不对,,Python解释器器就无无法帮帮我们们检查查。看一一下my_abs和内置置函数数abs的差别别:>>>my_abs('A')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"<stdin>",line2,inmy_absTypeError:unorderabletypes:str()>=int()>>>abs('A')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:badoperandtypeforabs():'str'参数检检查我们修修改一一下my_abs的定义义,对对参数数类型型做检检查,,只允允许整整数和和浮点点数类类型的的参数数。数数据类类型检检查可可以用用内置置函数数isinstance()实现::18defmy_abs(x):ifnotisinstance(x,(int,float)):raiseTypeError('badoperandtype')ifx>=0:returnxelse:return-x>>>my_abs('A')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"<stdin>",line3,inmy_absTypeError:badoperandtype变量的的作用用域1、变量量起作用用的代代码范范围称称为变变量的的作用用域,,不同同作用用域内内变量量名可可以相相同,,互不不影响2、在函数内内部定定义的的普通通变量量只在在函数数内部部起作作用,,称为为局部变变量。当函函数执执行结结束后后,局局部变变量自自动删删除,,不再再可以以使用3、局部变变量的引用用比全全局变变量速速度快快,应应优先先考虑虑使用用1、一个个变量量已在函函数外外定义义,如果果在函函数内内需要要为这这个变变量赋赋值,,并要要将这这个赋赋值结结果反反映到到函数数外,,可以以在函函数内内使用用global将其声明为全局局变量量。2、如果果一个个变量量在函数数外没没有定定义,在函数数内部部也可可以直直接将将一个个变量量定义义为全全局变变量,该函函数执执行后后,将将增加加一个个新的的全局局变量量。全局变变量可可以通通过关关键字字global来定义义。这这分为为两种种情况况:19>>>defdemo():globalxx=3y=4print(x,y)>>>x=5>>>demo()34>>>x3>>>yNameError:name'y'isnotdefined>>>delx>>>xNameError:name'x'isnotdefined>>>demo()34>>>x3>>>yNameError:name'y'isnotdefined变量的的作用用域——例子20如果局局部变变量与与全局局变量量具有有相同同的名名字,,那么么该局部变变量会会在自自己的的作用用域内内隐藏藏同名名的全全局变变量。>>>defdemo():x=3#创建建了局局部变变量,,并自自动隐隐藏了了同名名的全局变变量print(x)>>>x=5>>>demo()3>>>x#函数执执行不不影响响外面面全局局变量量的值值5变量的的作用用域——例子21如果需需要在在同一一个程程序的的不同同模块块之间间共享享全局局变量量的话话,可可以编编写一一个专专门的的模块块来实实现这这一目目的。例如如,假设设在模模块A.py中中有如如下变变量定定义::global_variable=0而在模块块B.py中包包含以以下用用来设设置全全局变变量的的语句句:importAA.global_variable=1在模块块C.py中有有以下下语句句来访访问全全局变变量的的值::importAprint(A.global_variable)变量的的作用用域——例子22lambda表达式式可以以用来来声明明匿名函函数,也就就是没没有函函数名名字的的临时时使用用的小小函数数,尤尤其适适合需需要一一个函函数作作为另另一个个函数数参数数的场场合。。也可可以定义匿名函数。lambda表达式只可以包含含一个表达达式,该表达式式的计算结结果可以看看作是函数数的返回值值,不允许许包含复合合语句,但但在表达式式中可以调调用其他函函数。Lambda表达式格式:>>>f=lambdax,y,z:x+y+z#可以给lambda表达式起名名字>>>f(1,2,3)#像函数一样样调用6>>>g=lambdax,y=2,z=3:x+y+z#参数默认值值>>>g(1)6>>>g(2,z=4,y=5)#关键参数1123>>>L=[(lambdax:x**2),(lambdax:x**3),(lambdax:x**4)]>>>print(L[0](2),L[1](2),L[2](2))4816>>>D={'f1':(lambda:2+3),'f2':(lambda:2*3),'f3':(lambda:2**3)}>>>print(D['f1'](),D['f2'](),D['f3']())568>>>L=[1,2,3,4,5]>>>print(list(map(lambdax:x+10,L)))#模拟向量运运算[11,12,13,14,15]>>>L[1,2,3,4,5]Lambda表达式24>>>data=list(range(20))#创建列表>>>data[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]>>>importrandom>>>random.shuffle(data)#打乱顺序>>>data[4,3,11,13,12,15,9,2,10,6,19,18,14,8,0,7,5,17,1,16]>>>data.sort(key=lambdax:x)#和不指定规规则效果一一样>>>data[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]>>>data.sort(key=lambdax:len(str(x)))#按转换成字字符串以后后的长度排排序>>>data[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]>>>data.sort(key=lambdax:len(str(x)),reverse=True)#降序排序>>>data[10,11,12,13,14,15,16,17,18,19,0,1,2,3,4,5,6,7,8,9]Lambda表达式25函数可以返返回多个值值吗?答案是肯定定的。比如在游戏戏中经常需需要从一个个点移动到到另一个点点,给出坐坐标、位移移和角度,,就可以计计算出新的的坐标:importmathdefmove(x,y,step,angle=0):nx=x+step*math.cos(angle)ny=y-step*math.sin(angle)returnnx,ny函数返回多个值(一)26importmathdefmove(x,y,step,angle=0):nx=x+step*math.cos(angle)ny=y-step*math.sin(angle)returnnx,ny27>>>x,y=move(100,100,60,math.pi/6)>>>print(x,y)但其实这只只是一种假假象,Python函数返回的的仍然是单单一值。>>>r=move(100,100,60,math.pi/6)>>>print(r)原来返回值是一一个tuple!多个变量可以以同时接收收一个tuple,按位置赋赋给对应的的值,所以以,Python的函数返回回多值其实实就是返回回一个tuple函数返回多个值(二)例1编写函数,,接收包含含20个整整数的列表表lst和和一个整数数k作为参参数,返回回新列表。。处理规则则为:将列列表lst中下标k之前的元元素逆序,,下标k之之后的元素素逆序,然然后将整个个列表lst中的所所有元素逆逆序。>>>defdemo(lst,k):x=lst[:k]x.reverse()y=lst[k:]y.reverse()r=x+yreturnlist(reversed(r))>>>lst=list(range(1,21))>>>print(lst)[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]>>>print(demo(lst,5))[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5]案例精选(一)28例2编写函数,,接收一个个正偶数为为参数,输输出两个素素数,并且且这两个素素数之和等等于原来的的正偶数。。如果存在在多组符合合条件的素素数,则全全部输出。。>>>importmath>>>defIsPrime(n):m=int(math.sqrt(n))+1foriinrange(2,m):ifn%i==0:returnFalsereturnTrue>>>defdemo(n):ifisinstance(n,int)andn>0andn%2==0:foriinrange(3,int(n/2)+1):ifi%2==1andIsPrime(i)andIsPrime(n-i):print(i,'+',n-i,'=',n)>>>demo(60)7+53=6013+47=6017+43=6019+41=6023+37=6029+31=60案例精选(二)29例3编写函数,接收两个个正整数作作为参数,,返回一个个元组,其其中第一个个元素为最最大公约数数,第二个个元素为最最小公倍数数。>>>defdemo(m,n):ifm>n:m,n=n,mp=m*nwhilem!=0:r=n%mn=mm=rreturn(n,int(p/n))>>>print(demo(20,30))(10,60)案例精选选(三)30函数设计计与使用用小结1、定义函数时,,需要确确定函数名和参数个数数2、如果有必要,,可以先先对参数数的数据类型型做检查3、函数体内部可可以用return随时返回回函数结果4、函数执行完毕毕也没有有return语句时,,自动returnNone5、函数可以同时时返回多个个值,但其实实就是一一个tuple31Python异常处理理结构32“”小故事欧洲阿丽丽亚娜5型火箭经经过近十十年研发发,1996年首次发发射失败败,火箭箭和箭上上卫星全全毁,造造成巨大大经济损损失。事事故起因因是新火火箭直接接继承了了4型火箭““久经考考验”的的控制系系统,但但5型火箭加加速度大大造成传传感器读读数大,,导致一一次从浮浮点数到到整数的的数值转转换溢出出。惯性性导航系系统失效效后飞行行状态失失控,控控制系统统关闭了了火箭的的状态调调节系统统,安全全系统最最后引爆爆火箭自自毁。33箭载软件件出错的的原因是是,没有有达到软软件容错错的目标标01异常的基基础知识识34“”异常概述述简单地说说,异常常是指程程序运行行时引发发的错误误,引发发错误的的原因有有很多,,例如除除零、下标越界界、文件件不存在在、网络络异常、、类型错错误、名名字错误误、字典典键错误误、磁盘盘空间不不足,等等。如果这些些错误得得不到正正确的处处理,将将会导致致程序终终止运行行,而合合理地使使用异常常处理结结果,可可以使得得程序更更加健壮壮,具具有更强强的容错错性,不不会因为为用户不不小心的的错误输输入或其其他运行行时原因因而造成成程序中中止。35基本概念Concept01020304语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常,例如由于大小写拼写错误而访问不存在的对象异常是指因为程序出错而在正常控制流以外采取的行为,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,就出现了异常异常分为两个阶段:第一个阶段是引起异常发生的错误;第二个阶段是检测并处理阶段当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常一、异常常的基本本概念36一、异常的几几种表现现形式37一、异常处理理的作用用1、提高程序的健健壮性和和容错性2、把晦涩难懂懂的错误误提示转转换为友友好提示示显示给给最终用户?可不可以以把所有有代码都都放到一一个异常常处理结结构中??影响出错错后的调调试和代代码维护护!?可不可可以为每每条语句句都配上上异常处处理结构构?导致代码码乱且庞庞大!注意:不建议使使用异常常来代替替常规的的检查,,如if…else判断应避免过过多使用用异常处处理机制制,只在在确实需需要时采采用使用用捕捉异常常时,应应尽量精精准,并并针对不不同类型型的异常常设计不不同的处处理代码码√√√38一、Python中异常类类的层次次结构BaseException+--SystemExit+--KeyboardInterrupt+--GeneratorExit+--Exception+--StopIteration+--StandardError|+--BufferError|+--ArithmeticError||+--FloatingPointError||+--OverflowError||+--ZeroDivisionError|+--AssertionError|+--AttributeError|+--EnvironmentError||+--IOError||+--OSError||+--WindowsError||+--VMSError(VMS)点击此处处编辑文文字阐述述您的论论文内容容,点击击此处编编辑文字字阐述您您的论文文内容,,点击此此处编辑辑文字阐阐述您的的论文内内容,点点击此处处编辑文文字阐述述您的论论文内容容,点击击此处编编辑文字字阐述您您的论文文内容,,点击此此处编辑辑文字阐阐述您的的论文内内容。+--Exception+--StandardError|+--EOFError|+--ImportError|+--LookupError||+--IndexError||+--KeyError|+--MemoryError|+--NameError||+--UnboundLocalError|+--ReferenceError|+--RuntimeError||+--NotImplementedError|+--SyntaxError||+--IndentationError||+--TabError|+--SystemError|+--TypeError|+--ValueError39一、Python自定义异异常类可以继承承python内置异常常类来实实现自定定义的异异常类classDatabaseException(Exception):#继承python的内置异异常类def__init__(self,err='数据库错错误'):#在自定义义异常类类中,重重写父类类init方法Exception.__init__(self,err)classPreconditionsException(DatabaseException):#继承DatabaseExceptiondef__init__(self,err='PreconditionsErr'):DatabaseException.__init__(self,err)40Python自定义异异常类如果自己己编写某某个模块块需要抛抛出多个个不同的的异常,,可以先先创建一一个基类类,再创创建多个个派生类类分别表表示不同同的异常常classMyError(Exception):#基类passclassInputError(MyError):def__int__(self,expression,next,message):#继承基类类,新建建派生类类self.expression=expressionself.message=messageclassTransitionError(MyError):def__int__(self,previous,next,message):#继承基类,新新建派生类self.previous=previousself.next=nextself.message=message4102常见异常处理理结构42二、try…except结构try:try块#被监控的语句句exceptException[asreason]:except块#处理异常的语语句try:try块exceptBaseExceptionase:#不建议这样做做except块……#处理所有错误误try子句中的代码码块放置可能能出现异常的的语句,except子句中的代码码块处理异常常当需要捕获所所有异常时,,可以使用BaseException43二、try…except……else结构forarginsys.argv[1:]:try:f=open(arg,'r')exceptIOError:print('cannotopen',arg)else:print(arg,'has',len(f.readlines()),'lines')f.close()如果try范围内捕获了了异常,就执执行except块:如果try范围内没有捕捕获异常,就就执行else块例如:查看多多个文本,分分析分别有多多少行44try:f=open(‘test.txt’,‘‘r’)line=f.readline()print(line)exceptIOError:print('cannotopenfile')finally:f.close()二、try…except……finally结构try:f=open(‘test.txt’,‘‘r’)line=f.readline()print(line)exceptIOError:print('cannotopenfile')finally:f.close()使用异常处理理结构保证文文件总是能关关闭这样真的可以以么???使用异常处理理结构的本意意是为了防止止文件读取操操作出现异常常而导致文件件不能正常关关闭,但是如如果因为文件件不存在而导导致文件对象象创建失败,,那么finally子句中关闭文文件对象的代代码将会抛出出异常,导致致程序终止运运行。45二、带有多个个except的try结构try:x=float(input('请输入被被除数:'))y=float(input('请输入除除数:'))z=x/yexceptZeroDivisionError:print('除数不能能为零')exceptTypeError:print('被除数和和除数应为数数值类型')exceptNameError:print('变量不存存在')else:print(x,'/',y,'=',z)46二、带有多个个except的try结构importsystry:f=open(‘myfile.txt’’)s=f.readline()i=int(s.trip())f.close()except(OSError,ValueError,RuntimeError,NameError):pass也可以这样写写:将要捕获的异异常写在一个个元组中,可可以使用一个个except语句捕获多个个异常:47>>>defdemo_div(a,b):try:returna/bexcept:passfinally:return-1使用带有finally子句的异常处处理结构时,,应尽量避免免在finally子句中使用return语句,否则可可能会出现出出乎意料的错错误。二、try…except……finally结构>>>demo_div(1,0)-1>>>demo_div(1,2)-148>>>defdiv(x,y)try:print(x/y)exceptZeroDivisionError:print(‘ZeroDivisionError’)exceptTypeError:print(‘TypeError’)else:print(‘NoError’’)finally:print(‘executingfinallyclause’)Python异常处理结构构中可以同时时包含多个except子句、else子句和finally子句二、try…except……except…else…finally结构49断言assert断言语句的语法是:assertexpression[,reason]assertlen(lists)>=5,‘列表元素个个数小于5’’assert2==1,'2不等于1'当判断表达式式expression为真时,什么么都不做;如如果表达式为为假,则抛出出异常。使用assert断言是学习python一个非常好的的习惯,在没完善一个程程序之前,我我们不知道程程序在哪里会会出错,与其其让它在运行时崩溃,不如在出现现错误条件时时就崩溃,这这时候就需要要assert断言的帮助。。断言语句assert也也是一种比较较常用的技术术,常用来在在程序的某个个位置确认指指定条件必须须满足,常和和异常处理结结构一起使用用50With上下文管理语语句在Python2.5中with关键字被加入,它是用来替代try…except……finally…的模式。1、使用with自动关闭资源源,可以在代代码块执行完完毕后还原进进入该代码块块时的现场。。2、不论何种原原因跳出with块,不论是否否发生异常,,总能保证文文件被正确关关闭,资源被被正确释放。。3、用于文件使用后自动关关闭,线程中中锁的自动获获取和释放withEXPR[asVAR]:BLOCKEXPR可以是任意表达式asVAR是可选的(起起别名)BLOCK是with语句的语句体体51With上下文管理语语句——案例file=open("/tmp/foo.txt")data=file.read()file.close()try:f=open('xxx')except:print'failtoopen'exit(-1)try:dosomethingexcept:dosomethingelse:f.close()52withopen("/tmp/foo.txt")asfile:data=file.read()02用sys模块回溯最后的异常53三、用sys模块回溯最后的异常54三、用sys模块回溯最后的异常当发生异常时,Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这时可以使用sys模块来回溯最近一次异常sys.exc_info()的返回值tuple是一个三元组组(type,value,traceback)type—————异常的类型value—————异常的信息或或者参数traceback—————包含调用栈信信息的对象格式如下:>>>importsys>>>try:block>>>except:tuple=sys.exc_info()print

温馨提示

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

评论

0/150

提交评论