28 异常处理 ,collections模块
主要内容:
1. 异常处理
a : 异常和错误的区别
error: 语法错误 比较明显的错误, 在编译代码阶段就能检测出啦
iteration : 异常 在执行代码过程中引发的异常
异常发生之后的结果 :一旦程序发生异常, 程序就不在继续执行了.
b : 最简单的异常处理:
l = ['登录', '注册', '退出']
for i in enumerate(l, 1):
print(i[0], i[1])
try:
num = int(input('num:'))
print(l[num - 1])
except IndexError:
print('您输入的数字无效')
c : 多分支异常处理:
l = ['登录', '注册', '退出']
for i in enumerate(l, 1):
print(i[0], i[1])
try:
num = int(input('num:'))
print(l[num - 1])
except ValueError:
print('请输入一个数字')
except IndexError:
print('您输入的数字无效')
d : 万能异常
try:
#name # NameError
dic = {}
dic['key'] #KeyError
except Exception as 变量名:
print(type(变量名),变量名,变量名.__traceback__.tb_lineno)
结果 : <class 'KeyError'> 'key' 27(追踪错误出现的行数)
万能异常与其他分支合作, 万能异常永远放在所有except最后
e : 异常的其他机制 try /except / else / finally
try:
a = 1
# name
# [][3]
except NameError:
print('name error')
except Exception:
print('万能异常')
else: # try中的代码正常执行 没有异常的时候会执行else中的代码
print('执行else了')
finally: # 无论如何都会执行 操作系统资源归还的工作
print('执行finally了')
try / except / else: 退出程序,仍然会执行else
try:
f = open('file','w')
# f.read()
exit()
except:pass
# 复杂的逻辑
finally:
f.close()
print('执行我啦')
try / finally :即使程序出现错误, 也会执行finally
def func():
try:
f = open('file', 'w')
return f.read()
finally:
f.close()
print('执行我了')
func()
f :主动抛异常: raise
try :
num = int(input('>>>:'))
except Exception:
print('在出现了异常之后做点儿什么,再让它抛异常')
raise #主动抛出异常:ValueError: invalid literal for int() with base 10: 'q'
h : 自定义异常
class EvaException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise EvaException('类型错误')
except EvaException as e:
print(e)
i : 断言
assert True
if False:
print(1234234)
else:
raise AssertionError
总结 : 尽量少用异常处理 ,
能通过逻辑避免的应该代码逻辑规避掉
应该对某一句/几句话来进行处理
最后在外层加一个大的异常处理.
2. collections模块 :数据类型的扩展模块
队列 : 先进先出
#队列, 先进先出
import queue
q = queue.Queue()
print(q.qsize())
q.put(1)
q.put('a')
q.put((1,2,3))
print('q : ',q) #q : <queue.Queue object at 0x000002598A048908>
print(q.get()) # 1
双端队列 : deque
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)
dq.appendleft('a')
dq.appendleft('b')
print(dq) #deque(['b', 'a', 2, 5])
print(dq.pop()) #5
print(dq) #deque(['b', 'a', 2])
print(dq.popleft()) #b
print(dq) #deque(['a', 2])
print(dq.remove('a'))
print(dq.insert(2, '123'))
print(dq)
总结 : 在insert remove的时候 deque的平均效率要高于列表
列表根据索引查看某个值的效率要高于deque
append 和pop对于列表的效率是没有影响

浙公网安备 33010602011771号