python基础方面三

异常

捕获异常 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库


python基础方面三


python基础方面三