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

原文地址:https://www.cnblogs.com/gyh412724/p/9471247.html