zoukankan      html  css  js  c++  java
  • 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对于列表的效率是没有影响

  • 相关阅读:
    .NET平台系列18 .NET5的超强优势
    .NET平台系列17 .NET5中的ARM64性能
    .NET平台系列19 新世界中的.NET大统一平台架构解析
    .NET平台系列16 .NET5/Asp.Net Core 在全球Web框架权威性能测试 Web Framework Benchmarks 中的吊炸天表现
    .NET平台系列15 .NET5的吊炸天性能改进
    .NET平台系列14 .NET5中的新增功能
    从零开始学Typescript-类型注解
    从零开始学Typescript-第一个TS程序
    从零开始学Typescript-安装Typescript
    从零开始学VUE-创建VUE应用
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9471247.html
Copyright © 2011-2022 走看看