前段时间面试网易、深信服等亲身遇到,遂做记录总结。
Python开发理论基础面试题
一、Python的内存管理
1、python内存管理是由私有堆空间管理,需要申请和释放内存
2、用引用计数机制实现垃圾回收
3、Python有内存池的机制,为了防止频繁申请和释放内存,会将不用内存放到内存池而不是返回给操作系统
二、Python的gc垃圾回收
1、在Python中,主要通过引用计数进行垃圾回收
2、通过 “标记-清除” 解决容器对象可能产生的循环引用问题
3、通过 “分代回收” 以空间换时间的方法提高垃圾回收效率
三、python里while 1 和while True的区别?
1、由于Python2中,True/False不是关键字,因此我们可以对其进行任意的赋值
这就导致程序在每次循环时都需要对True/False的值进行检查
2、而对于1,则被程序进行了优化,而后不会再进行检查
While true 和while 1在python3里面没有区别
四、Python为什么类要继承object?,继承和不继承有什么区别?
1、在python2中继承 object 类的是新式类,不继承 object 类的是经典类
2、新式类,当调用 负类的方法时候,Python 会按照广度优先方式去搜索
而经典类是用深度优先方法去搜索
五、讲讲Pythond装饰器?
1、装饰器是一个函数,其主要用途是包装另一个函数或类。
2、 这种包装的首要目的是透明地修改或增强被包装对象的行为。
六、什么是Python的闭包?
1、内层函数引用了其外部作用域的变量,然后返回内层函数的情况,称为闭包。
2、python一般以内外函数实现
七、python节省内存的方法:
1、类里面增加__slot__方法, 如果确定了对象属性成员,不会再动态增加
2、使用touple代替list
3、Namedtuple代替数据对象
4、适当使用弱应用
5、生成器、代器代替集合数据类型
原则一:尽量用不可变对象类型代替可动态增加对象类型
八、讲讲python弱引用
1、对一个对象进行弱引用,即不会由引用计数,即这个对象的内存还是有可能被回收掉
2、一般弱引用的应用场景是,些还有用但并非必须的对象,并且很费资源的对象
九、什么是闭包?
1、使用环境范围之外的变量,即内函数在其它定义环境使用
2、当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点
①、必须有一个内嵌函数
②、内嵌函数必须引用外部函数中的变量
③、外部函数的返回值必须是内嵌函数
十、Python的装饰器原理
1、原理是闭包.
2、在不用修改原函数代码情况下,就可以给原函数添加新功能,并且在调用的时候和原来调用一模一样
十一、Python字典的底层实现?
1、字典底层是哈希实现的
2、容量大于等于 2/3 时,字典就会扩容(扩容时散列表中键的次序变化)
3、在对元素进行变化操作(删除等)时,底层只是对数据进行状态切换(Unused态、Active态、和Dummy态)
4、解决哈希冲突的方法:是开放地址方法
十二、python有什么调试工具?
1、pdb
2、pySnooper
十三、什么是协程?
1、轻量级的线程
2、处于用户态、非抢占
3、用户调度、非系统调度,效率较高
4、极高的执行效率,因为子程序切换而不是线程切换,没有了线程切换的开销
5、不需要多线程的锁机制,因为只有一个线程在执行
十四、Python的协程?
1、python2是通过yeil实现、greve
2、python3是通过synix
十五、__new__() 与 __init__()的区别
1、__new__是一个静态方法,而__init__是一个实例方法.
2、__new__方法会返回一个创建的实例,而__init__什么都不返回.
3、只有在__new__返回一个cls的实例时后面的__init__才能被调用.
4、当创建一个新实例时调用__new__,初始化一个实例时用__init__.
十六、GIL锁?为什么使用GIL锁?
1、即全局解释锁,每个时间段只允许一个线程在CPU中运行
2、为了解决多线程之间数据完整性和状态同步的问题,保证Python解释器中原子操作的线程安全,解决不同线程之间的数据一致性问题。