一、异常处理
1、万能异常(try except Exception)
把可能发生错误的语句放在try模块里,用except来处理异常。except可以处理一个专门的异常,也可以处理一组圆括号中的异常,如果except后没有指定异常,则默认处理所有的异常。每一个try,都必须至少有一个except。
1 2 3 4 5
| s1 = 'hello' try: int(s1) except Exception as e: print(e)
|
2、主动触发异常
python自己定义的内建异常不够用,用户可以自定义异常。
1 2 3 4
| try: raise UserError("自定义异常") except FError as e: print(e)
|
或者使用Exception将异常信息捕获。
1 2 3 4
| try: func(a) except Exception as e: raise Exception(f"错误模块:{name} \n错误信息: {str(e)}")
|
二、Python装饰器
装饰器是给现有的模块增添新的小功能,可以对原函数进行功能扩展,而且还不需要修改原函数的内容,也不需要修改原函数的调用。装饰器的使用符合了面向对象编程的开放封闭原则。
开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。
Python之中,万物皆对象,即万物都可传参。那么函数也可以作为函数的参数进行传递的。
1 2 3 4 5 6 7 8 9 10 11 12 13
| def polar_bear(): print("我是爱上企鹅的北极熊") def blog(name): print('进入blog函数') name() print('我的博客是 lepzh.top') if __name__ == '__main__': func = polar_bear func() print('------------') blog(polar_bear)
|
如果想知道,这两个函数分别的执行时间是多少,将代码修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import time def polar_bear(): t1 = time.time() print("我是爱上企鹅的北极熊") print("执行时间为:", time.time() - t1) def blog(name): t1 = time.time() print('进入blog函数') name() print('我的博客是 lepzh.top') print("执行时间为:", time.time() - t1) if __name__ == '__main__': func = polar_bear func() print('------------') blog(polar_bear)
|
如果函数数量众多或者函数内容过于复杂,那么逐个给函数添加time计算代码耗时且耗力,由此引出装饰器的使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import time def runtime1(func): def wrapper(): t1 = time.time() func() t2 = time.time() print("执行时间为:{:.4} s".format(t2 - t1)) return wrapper
def runtime2(func): def wrapper(*args, **kwargs): t1 = time.time() res = func(*args, **kwargs) t2 = time.time() print("执行时间为:{:.4} s".format(t2 - t1)) return res return wrapper
@runtime1 def polar_bear(): print("我是爱上企鹅的北极熊")
@runtime2 def blog(name): print('进入blog函数') name() print('我的博客是 lepzh.top') return 100
if __name__ == '__main__': mine = polar_bear mine() print('------------') blog(polar_bear)
|
在runtime2()中,wrapper函数的参数为*args和**kwargs,表示可以接受任意参数形式。该装饰器普遍适用于函数有参数以及返回值的时候。