1.深浅拷贝
- 深拷贝
- 递归拷贝父对象和子对象
- 新开辟一块内存空间
- 新对象的修改不会影响旧对象
- 浅拷贝
- 只拷贝父对象
- 两者的内存地址一样
- 新对象的内容操作会影响旧对象的内容
2.生成器和迭代器
2.1 生成器
- 生成器函数
yield
返回当前得到值
def gensquares(n):
for i in range(5):
yield i**2
for item in gensquares(5):
print item
- 生成器表达式
gensquares = (i**2 for i in range(5))
2.2 迭代器
next()
调用时返回下一个值;如果没有,则抛出StopIteration异常iter()
返回迭代器本身
3.is和==的区别
is
:比较对象的id==
:比较对象的值
4.python传参时需要注意什么
- 必备参数项的传参顺序,参数数量
- 关键字参数:允许函数调用时参数的顺序与声明不一致
- 默认参数传参
- 不定长参数 ( * 加一个星号)
- 可变类型与不可变类型
- 在参数传参时,实参将值复制给了形参,此时两者指向同一个对象
- 在函数内修改形参
1。不可变类型:修改变量需要新建一个对象
2。可变类型:直接在原对象上修改
5.装饰器
增强函数或类功能的一个函数,可以装饰函数(函数也是对象)
- 定义装饰器
def decorator(func):
def wrapper(*args,**kargs):
// 自定义传参
print(func.__name__)
// 返回传入的方法名参数的调用
return func(*args,**kargs)
返回内层函数名
return wrapper
- 使用装饰器
- 使用语法糖@
- 不使用语法糖
装饰器不传入参数时
f = decorator(函数名)
传入参数
f = (decorator(参数))(函数名)
常见的内置装饰器有三种,@property、@staticmethod、@classmethod
6.函数或变量的作用域
- 局部变量:定义在函数内部,局部作用域;局部变量只能在被声明的函数内部访问
- 全局变量:在整个程序中都可访问,在函数声明的变量名都被加入至作用域中
- 函数体内如果想使用函数体外的变量,需要
gloabl
声明
7.解释型和编译型语言的区别
8.init和new的区别
__init__
:用在初始化一个类实例,是创建类实例之后调用
def __init__(self,name,age):
self.name = name
self.age = age
__new__
:创建类实例的方法
def __new__(cls, name, age):
print '__new__ called`
return super(Person, cls).__new__(cls, name, age)
- 用法不同
init:初始化实例,实例级别的方法,可以设置对象属性值
new:创建实例,类级别的静态方法
- 传入参数不同
init:至少有一个参数self,就是__new__()返回的实例
new:至少有一个参数cls,代表当前类
- 返回值不同
init:不需要返回值
new:返回实例对象
9. 常用模块
10.list和array的区别
1. List列表:数据类型可不相同,存储的是数据指针;array:数组元素类型相同
2. Array是一段连续的存储地址,List则是不连续的,List每个节点上都有一个Next属性,指向下一个节点地址
3. Array指定大小,List无确切大小
11.lambda函数
匿名表达式:无须定义函数名
res = lambda x,y : x+y
res(2,4)
12.类中的self
self代表当前类实例对象本身,可以调用当前类中的属性和方法
13.python面向对象
14.python中内存管理机制
- 引用计数
- 垃圾回收
- 内存池机制
15.dict和list的底层实现
- Dict字典通过Hash表实现,{key:value}
- List:顺序表,不确定大小
16.垃圾回收机制
python中的GC模块主要运用了引用计数
来跟踪和回收垃圾。在引用计数的基础上,还可以通过标记清除
来解决容器(指Array、Dict、Tuple)对象可能产生的循环引用的问题
- 引用计数原理
当一个对象被创建引用或者复制的时候,对象的引用次数就会加1,当一个对象被销毁时,对象的引用次数就会减1,当对象的引用次数减为0时,就可以释放其内存了
- 标记清除原理
> 标记清除解决容器的循环引用问题。
> 首先为了追踪对象,在每个容器对象维护两个额外的指针,用来对容器对象组成一个链表,指针分别指向前后两个容器对象
17.GIL锁
全局解释器锁。
在Cpython解释器中执行每一个python线程,都会先锁住自己,以阻止别的线程执行。每一个线程在执行时,都会锁住GIL,阻止其他线程执行,每一个线程执行完毕,会释放GIL,允许其他线程开始利用资源