主要内容:
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对于列表的效率是没有影响