异常
捕获异常 try...except...
else 没有捕获异常云行
finally 一定运行的代码
有异常 中断,然后在except中执行
raise 抛出异常 与Java throw 一样
模块
import from .. import from .. import *
as 起小名
定位模块 顺序是:
1当前目录
2shell 变量PYTHONPATH下的每个目录
3 默认路径 Unix下 默认路径一般为/usr/local/lib/python/
4模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
包 功能相同模块放在一起 有一个__init__.py文件,里面是__all__=["模块名","模块名"]
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包
有效避免模块名称冲突问题,让应用组织结构更加清晰
__init__.py 文件写方法那么导入包时就会被调用
设计模式 :
简单工厂模式:定义一个类,通过传入参数 返回一个特定的类
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
元类:创建类的类,像type(python 所有类的父) str(创建字符串对象) int(创建整数对象)
可以通过__class__来看自己是谁创建的,__class__.__class__可以看到更上的创建类;
__metaclass__可以指定元类来创建对象,如果不指定,(先找父类,再找模块)默认type
动态创建属性与方法
P.run = types.MethodType(run, P)#给这个对象添加实例方法
Person.testClass = testClass #给Person类绑定类方法 testClass 上要有@classmethod
Person.testStatic = testStatic #给Person类绑定静态方法 testStatic 上要有@staticmethod
删除属性方法
删除的方法:
del 对象.属性名
delattr(对象, "属性名")
列表生成式 [ x*2 for x in range(5)]
生成器:一边循环一边计算的机制,称为生成器:generator ( x*2 for x in range(5)) 上面改成小括号,生成对象,通过调用next()得到下个值,没有值时报错,还可以有yield
迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
是可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
isinstance() 判断对象是否可以迭代
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
生成器都是 Iterator 对象 通过iter([]) 可以将 list 、 tuple 、 dict 、 set 、 str变成迭代器
闭包:
#在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
内部函数对外部函数作用域里变量的引用(非全局变量),则
称内部函数为闭包。
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
装饰器:运用闭包原理给方法加上其它功能
引入日志
函数执行时间统计
执行函数前预备处理
执行函数后清理功能
权限校验等场景
缓存
作用域
LEGB 规则 locals 当前所在命名空间-> enclosing function 外部嵌套函数的命名空间(闭包中常见)-> globals 全局变量,函数定义所在模块的命名空间 -> builtins 内建模块的命名空间。
is与== is 比较是否指向同一个对象 == 比较两对象是否相等
深拷贝, 深拷贝是对于一个对象所有层次的拷贝(递归) copy.deepcopy
浅拷贝 : 拷贝了引用,并没有拷贝内容 赋值=
copy.copy 拷贝不可变类型直接浅拷贝, 如果可变类型 ,只考贝第一层
可变类型 列表 字典
不可变 元祖,数字,字符串
copy是浅拷贝,只拷贝可变对象的父级元素。 deepcopy是深拷贝,递归拷贝可变对象的所有元素
[-5, 257) 数字已经在python中建好 其他的大数字均要创建新对象
intern机制 字符串 (没空格)不可修改,默认开启intern机制引用计数为0则销毁 有空格不开启
垃圾回收
1引用计数机制 (主要) :python每个东西都是对象,核心是一个结构体 PyObject(每个对象必有),里面的ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。当引用计数为0时,该对象生命就结束了。
优点: 简单,实时(垃圾回收时间分摊到平时)
缺点:维护引用计数消耗资源,循环引用无法回收
+1情况
对象被创建,例如a=23
对象被引用,例如b=a
对象被作为参数,传入到一个函数中,例如func(a)
对象作为一个元素,存储在容器中,例如list1=[a,a]
-1 情况
对象的别名被显式销毁,例如del a
对象的别名被赋予新的对象,例如a=24
一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
对象所在的容器被销毁,或从容器中删除对象
2标记-清除和分代收集为辅:
标记的时候需要确定内存对象的集合Root set,集合里的对象都是可以访问的。如果Root set中的对象引用了其他的对象,那么被引用的对象也不能被标记为垃圾对象。然后从Root set出发,递归遍历Root set能访问到的所有对象,进行标记为不是垃圾对象。遍历结束后,没有被标记的就是垃圾对象。
分代收集:
分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。
Python默认定义了三代对象集合,索引数越大,对象存活时间越长
常用的python库