简明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() 它的目的是把缓冲区的内容马上打印,这里有个讨论:
-
python 中,输出到命令行中实际被我们看到的内容都是经由 sys.stdout()输出的。
-
而 print ( python3 中变为 print()函数)其实是执行了stdout.write( content + "\n" )
-
stdout 有缓冲区,即不会每一次写入就输出内容,而是会在得到相应的指令后(如果缓冲区的内容中新增了换行符,那么 stdout 就会自动将缓冲区内的内容输出!)才将缓冲区中的内容输出到目标。sys.stdout.flush() 的作用就是显式地命令 stdout 输出缓冲区的内容。
- 在 Linux 上, 使用 python3 时,应将实例中的 print i,
-
改为
print(i, end='')
才会有效果。其实,要令 stdout 输出缓冲区内的内容, 不只有 stdout.flush() 方法。像下面这样:
-
原来: stdout 的缓冲区中有: "contentndicn djsnxn sknznain dn ciand"
现在我们调用 stdout.write("\n") , 缓冲区中内容变为
"contentndicn djsnxn sknznain dn ciand\n", stdout 检测到缓冲区内容以换行符结尾,它就会直接将缓冲区内容输出,不需要显式调用 stdout.flush() 方法。
-
然后,在 python 中,print 后自动会接换行符;python3 中, print() 有一个默认的关键字参数 end="\n" (看形参已经可以知道用途了:这个关键字参数就是在内容后面默认接的东西)所以正常使用 print 时, print 会默认接换行符,也就是默认将缓冲区内的内容全部输出;
而当我们用 print, (就是连续输出,中间不接换行符)或是 print( 内容, end=" ")时,print 就不会自动将 stdout 缓冲区内的内容通过在内容最后加换行符的方式输出
-
最后,关于不同系统适应性的问题,这就是因为不同系统换行符不同啦。
-
这里有一行修改,和上面的实现效果一模一样:
诸如 __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() 用于移除列表最后一个元素(默认)