一、异常处理:
-
什么是异常?
异常是在影响程序正常执行过程的一个事件。如果不捕获处理,将会导致程序终止执行。 -
常见异常:
1).当分母为0时,出现错误
2).当变量未被定义就使用时的报错
3).不同类型进行运算时的报错
4).索引异常:
5).字典Key值错误:KeyError
缩进异常:
-
异常处理
try:
try里面写的是要执行的代码:
当try中出现报错语句时,该错误语句以下的程序都不会打印
except NameError:
try里的代码异常才会执行的代码;
该命令只对NameError错误进行处理
else:
判断是否有异常, 如果没有, 执行此代码
finally:
有异常和没有异常都会执行的代码; -
触发异常
使用raise语句自己触发异常:
格式:raise[Exception[,args[,traceback]]]
语句中 Exception 是异常的类型,参数标准异常中任一种;
args 是自已提供的异常参数。 -
用户自定义异常:
class AgeException(Exception):
pass
“pass是指代码不执行任何语句,但是不为空”
二、垃圾回收机制:
-
对象池
1).小整数对象池
范围:[-5,257)
在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象.
小整数池的作用之一为避免因为整数的频繁申请和销毁内存空间。
2).大整数对象池
每个大整数都会创建一个新的对象
3).字符串驻留机制,intern机制
通过维护一个字符串常量池,从而试图只保存唯一的字符串对象,达到既高效又在处理字符串时节省了内存。
在创建一个新的字符串对象后,Python 先比较常量池中是否有相同的对象(interned),有的话则将指针指向已有对象,并减少新对象的指针,新对象由于没有引用计数,就会被垃圾回收机制回收掉,释放出内存。
字符串含有空格,不可修改,还有,本机制使用前需要启用,共用对象不生效,引用为0的情况下,就会被销毁。
python采用的是"引用计数机制"为主,"标记-清除"和"分代收集"两种机制为辅的策略 -
引用计数机制
GC 原本是一种“释放怎么都无法被引用的对象的机制”,可以让所有对象事先记录下“有多少程序引用自己”。让各对象知道自己的“人气指数”,从而让没有人气的对象自己消失,这就是引用计数法(Reference Counting).
导致引用计数加1的情况
1). 对象被创建 a=1, +1
2). 对象被引用:+1
a=1
b=a
3).对象作为参数参与函数,fun(a)
4).对象作为一个元素,存储在容器中,例如list1=[a,a]
导致引用计数-1的情况:
1). 对象的别名被显式销毁,例如del a
2). 对象的别名被赋予新的对象,例如a=24
3). 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4). 对象所在的容器被销毁,或从容器中删除对象
好处:
不引用便可以释放所占内存且简单
坏处:
维护引用计数消耗资源
循环引用
-
标记-清除
GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。
如果被标记的对象时存活的,剩下的未标记的对象为垃圾
清除这些无用的垃圾对象,把它们送回到可用列表 -
分代收集
按照不同的版本和代来先将手机易变成垃圾的对象,提高回收垃圾的效率。我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。
新生代 GC 将存活了一定次数的新生代对象当作老年代对象来处理。我们把类似于这样的新生代对象上升为老年代对象的情况称为晋升(promotion)
老年代对象很难成为垃圾,所以我们对老年代对象减少执行 GC 的频率, 从而提高效率。 -
gc模块
该模块提供垃圾回收的接口,包括禁用gc,调整回收频率,配置debug选项,同时提供对无法释放内存对象的访问权。