1、 可变与不可变类型
从内存地址来说,
不可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型;
可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
不可变数据类型更改后地址发生改变,可变数据类型更改地址不发生改变。
2、 浅拷贝与深拷贝的实现方式、区别 设计实现 deepcopy
浅拷贝:是在复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程;
深拷贝:复制整个依赖的变量,内存图中表示都被复制。
采用递归的思想设计实现 deepcopy 。
3、__new__() 与 __init__()的区别
a. 用法不同
__new__() 用于创建实例,所以该方法是在实例创建之前被调用,它是类级别的方法,是个静态方法;而 __init__() 用于初始化实例,所以该方法是在实例对象创建后被调用,它是实例级别的方法,用于设置对象属性的一些初始值。
b. 传入参数不同
__new__() 至少有一个参数 cls,代表当前类,此参数在实例化时由 Python 解释器自动识别;
__init__() 至少有一个参数 self,就是这个 __new__()返回的实例,__init__() 在 __new__() 的基础上完成一些初始化的操作。
c. 返回值不同
__new__() 必须有返回值,返回实例对象;
__init__() 不需要返回值 。
4、设计模式
设计模式是一套被反复使用,多数人知道,经过分类编目的代码设计经验总结 。使用设计模式是为了提高代码可重用性,可阅读性,和可靠性 。
创建型设计模式;
结构型设计模式;
行为型设计模式 。
5、编码与解码
计算机中存储的信息都是二进制的 。编码/解码本质上是一种映射(对应关系)。
编码:真实字符与二进制串的对应关系,真实字符 --> 二进制串;
解码:二进制串与真实字符的对应关系,二进制串 --> 真实字符 。
常见的有 ASCII 、utf8 等 。
6、 列表推导 list comprehension 和生成器的优劣
列表推导式( list comprehension )使用简易方法,将可迭代对象转换为列表。
生成器是能够动态提供数据的可迭代对象,生成器循环一次计算一次返回一次,对大数据量处理非常有用 。
生成器可以提高代码的可读性,生成器可以节省大量的内存。
7、装饰器 函数之后进行装饰
装饰器是在不改变原函数的调用以及内部代码情况下,为其添加新功能的函数。也可以说包装的目的是在不改变原函数名的情况下改变被包装对象的行为。
...
8、使用装饰器实现的单例模式
...
使用装饰器单例属性不会被覆盖,因为装饰器单例模式是直接返回之前生成的对象并不会初始化对象。
像 __init__ 方法构建你的单例模式会重新调用 __init__ 方法,为实例重新初始化属性。
9、正则表达式匹配邮箱
pattern = '[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+\.[a-z]'
10、垃圾回收
引用计数:
Python解释器对正在使用的对象保持计数。当对象不再引用指向的时候,垃圾收集器可以释放该对象,获取分配的内存。
当分配对象和取消分配对象的差值高于阈值时垃圾回收才会被启动。
分代回收:
Python 将所有的对象分为 0、1 和 2 三代,所有的新建对象都是 0 代,当某一对象经过垃圾回收,依然存活,那么就归为下一代对象,垃圾回收启动时,一定会扫描 0 代对象。如果 0 代经过一定次数的垃圾回收,那么就启动对 0 代和 1 代的扫描清理。当 1 代也进行了一定次数的垃圾回收后,那么会启动对 0、1 和 2 代对所有对象的扫描 。
孤立引用环:
对象互相引用彼此,构成引用环 。
删除引用之后,这两个对象不可能从程序中调用,就没什么用处了,但因为有引用环的存在,两个对象的引用计数并没有变为0,不会被垃圾回收 。
为了回收这样的引用环,python 复制每个对象的引用计数,可以记为 gc_ref ,当 gc_ref 不为 0 的对象和对象的引用对象,需要保留,其他对象则被垃圾回收 。
11、 多进程与多线程的区别 CPU密集型适合多线程
两者都是多任务编程方式,都能使用计算机多核资源;
进程的创建删除消耗的计算机资源比线程多;
进程空间独立,数据互不干扰,有专门通信方法;
线程使用全局变量通信;
一个进程可以有多个分支线程,两者有包含关系;
多个线程共享进程资源,在共享资源操作时往往需要同步互斥处理;
进程线程在系统中都有自己的特有属性标志,如ID、代码段、命令集等 。
如果是相对独立的任务模块,可能使用多进程;如果是多个分支共同形成一个整体任务可能用多线程 。
线程共享内存空间,进程的内存是独立的 。
同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现 。
一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程 。
优缺点:
a. 多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程 。但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源 。
b. 多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩溃,因为它们共享了进程的内存资源池。
12、进程通信的方式
进程间通信( IPC,InterProcess Communication )是指在不同进程之间传播或交换信息 。
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。
13、