• 简明python_Day11_异常、特殊method、单语句块、assert语句


    2019.5.19  Today it's a very nice day~ 所以下午可能会出去走走。

    学习内容:异常处理:错误->异常(try)->处理异常(try...except)->抛出异常(raise)

         time.sleep(x)、sys.stout.flush()、file类的with方法

         标准库暂时跳过

         特殊method、单语句块、assert语句

    #######################################################################################

    错误:错误出现时python会抛出一个错误,因为有一个Error Handler来处理这种事情。

    创建异常类型:

      1)出现异常:

      

      EOF:文件结尾(错误定位)

    python标准异常

    BaseException   所有异常的基类
    SystemExit   解释器请求退出
    KeyboardInterrupt   用户中断执行(通常是输入^C)
    Exception   常规错误的基类
    StopIteration   迭代器没有更多的值
    GeneratorExit   生成器(generator)发生异常来通知退出
    StandardError   所有的内建标准异常的基类
    ArithmeticError   所有数值计算错误的基类
    FloatingPointError   浮点计算错误
    OverflowError     数值运算超出最大限制
    ZeroDivisionError 除(或取模)零 (所有数据类型)
    AssertionError   断言语句失败
    AttributeError   对象没有这个属性
    EOFError   没有内建输入,到达EOF 标记
    EnvironmentError   操作系统错误的基类
    IOError   输入/输出操作失败
    OSError   操作系统错误
    WindowsError   系统调用失败
    ImportError   导入模块/对象失败
    LookupError   无效数据查询的基类
    IndexError   序列中没有此索引(index)
    KeyError   映射中没有这个键
    MemoryError   内存溢出错误(对于Python 解释器不是致命的)
    NameError   未声明/初始化对象 (没有属性)
    UnboundLocalError   访问未初始化的本地变量
    ReferenceError   弱引用(Weak reference)试图访问已经垃圾回收了的对象
    RuntimeError   一般的运行时错误
    NotImplementedError   尚未实现的方法
    SyntaxError Python   语法错误
    IndentationError   缩进错误
    TabError Tab   和空格混用
    SystemError   一般的解释器系统错误
    TypeError   对类型无效的操作
    ValueError   传入无效的参数
    UnicodeError Unicode   相关的错误
    UnicodeDecodeError Unicode   解码时的错误
    UnicodeEncodeError Unicode   编码时错误
    UnicodeTranslateError Unicode   转换时错误


    Warning 警告的基类
    DeprecationWarning   关于被弃用的特征的警告
    FutureWarning   关于构造将来语义会有改变的警告
    OverflowWarning   旧的关于自动提升为长整型(long)的警告
    PendingDeprecationWarning   关于特性将会被废弃的警告
    RuntimeWarning   可疑的运行时行为(runtime behavior)的警告
    SyntaxWarning   可疑的语法的警告
    UserWarning   用户代码生成的警告

      2)处理异常:try...except...else  这个的意思是,我不用python默认的处理器,而是在错误发生时,使用我愿意的处理。else:没有出现异常时执行。

      3)抛出异常:raise 语句引发一次异常。能够引发的错误或异常必须是直接或间接从属于 Exception (异常) 类的派生类。

      用户还能自定义异常类:

      回顾:这里 Exception.__init__(self) 不加也没什么问题,但我们格式上还是要加的,至于为什么要返回“类与对象”里继承的说明

     

      4)try...finally: 无论是否发生异常,都执行的操作。

      time.sleep(x)   代表插入x秒休眠,使程序缓慢。

      关于 sys.stout.flush() 它的目的是把缓冲区的内容马上打印,这里有个讨论:

      1. python 中,输出到命令行中实际被我们看到的内容都是经由 sys.stdout()输出的。

      2. 而 print ( python3 中变为 print()函数)其实是执行了stdout.write( content + " " )

      3.  stdout 有缓冲区,即不会每一次写入就输出内容,而是会在得到相应的指令后(如果缓冲区的内容中新增了换行符,那么 stdout 就会自动将缓冲区内的内容输出!)才将缓冲区中的内容输出到目标。sys.stdout.flush() 的作用就是显式地命令 stdout 输出缓冲区的内容

      4. 在 Linux 上, 使用 python3 时,应将实例中的 print i,  
      5. 改为 

        print(i, end='')

        才会有效果。其实,要令 stdout 输出缓冲区内的内容, 不只有 stdout.flush() 方法。像下面这样:

      6. 原来: stdout 的缓冲区中有: "contentndicn  djsnxn  sknznain   dn ciand"

        现在我们调用 stdout.write(" ") , 缓冲区中内容变为

        "contentndicn  djsnxn  sknznain   dn ciand ", stdout 检测到缓冲区内容以换行符结尾,它就会直接将缓冲区内容输出,不需要显式调用 stdout.flush() 方法。

      7. 然后,在 python 中,print 后自动会接换行符;python3 中, print() 有一个默认的关键字参数 end=" " (看形参已经可以知道用途了:这个关键字参数就是在内容后面默认接的东西)所以正常使用 print 时, print 会默认接换行符,也就是默认将缓冲区内的内容全部输出;

        当我们用 print, (就是连续输出,中间不接换行符)或是 print( 内容, end=" ")时,print 就不会自动将 stdout 缓冲区内的内容通过在内容最后加换行符的方式输出

      8. 最后,关于不同系统适应性的问题,这就是因为不同系统换行符不同啦。

     
      4)with语句:替代了open和finally中的close,为什么会这样呢?
       它总会在代码块开始之前调用 thefile.__enter__ 函数,并且总会在代码块执行完毕之后调用 thefile.__exit__ 。
       这里有一行修改,和上面的实现效果一模一样: 
     #######################################################################################
     
    特殊方法:

      诸如 __init__ 和 __del__ 等一些方法对于类来说有特殊意义。

      特殊方法用来模拟内置类型的某些行为。举个例子,如果你希望为你的类使用 x[key] 索引操作(就像你在列表与元组中使用的那样),那么你所需要做的只不过是实现__getitem__() 方法,然后你的工作就完成了。如果你试图理解它,就想想 Python 就是对list 类这样做的!

      下面的表格列出了一些有用的特殊方法。如果你想了解所有的特殊方法,请参阅手册。

    __init__(self, ...)    这一方法在新创建的对象被返回准备使用时被调用。

    __del__(self)    这一方法在对象被删除之前调用(它的使用时机不可预测,所以避免使用它)

    __str__(self)    当我们使用 print 函数时,或 str() 被使用时就会被调用。

    __lt__(self, other)    当小于运算符(<)被使用时被调用。类似地,使用其它所有运算符(+、> 等等)时都会有特殊方法被调用。

    __getitem__(self, key)    使用 x[key] 索引操作时会被调用。

    __len__(self)    当针对序列对象使用内置 len() 函数时会被调用

    #######################################################################################

    单语句块: (不建议使用)

      如果你的语句块只包括单独的一句语句,那么你可以在同一行指定它,例如条件语句与循环语句。

      如,  if flag: print('Yes')

       注意,单个语句是在原地立即使用的,它不会被看作一个单独的块。尽管,你可以通过这种方式来使你的程序更加小巧,但除非是为了检查错误,我强烈建议你避免使用这种快捷方法,这主要是因为如果你不小心使用了一个“恰到好处”的缩进,它就很容易添加进额外的语句。

    #######################################################################################

    assert 语句(建议多使用):

        assert 语句用以断言(Assert)某事是真的。例如说你非常确定你正在使用的列表中至少包含一个元素,并想确认这一点,如果其不是真的,就抛出一个错误,assert 语句就是这种情况下的理想选择。当语句断言失败时,将会抛出 AssertionError。

     

       list.pop()  用于移除列表最后一个元素(默认)

  • 相关阅读:
    Java 字节码解释说明
    JVM垃圾回收:G1回收器
    JVM 参数
    HotSpot 虚拟机对象探秘
    JDK 内置图形界面工具
    Java 内存模型
    在网络设备上调试 Android 程序
    .NET MVC异步调用中的Session问题
    在MVC的ApiController中实现统一校验
    使用 AndroidX86 在虚拟机中作为调试设备
  • 原文地址:https://www.cnblogs.com/marvintang1001/p/10891224.html
Copyright © 2020-2023  润新知