python面试总结(持续更新........)

1.python的垃圾回收机制?(GC引用计数,这块内存引用的计数为零时就会被释放)

2.python的深拷贝浅拷贝?(区别是是否是内存的引用,copy.copy()浅拷贝,copy.deepcopy()深拷贝)

3.python的os.isdir,os.listdir,os.path.join?(作用,判断是不是文件夹,返回文件夹下所有的目录,进行路径拼接判断了平台的区别)

4.yield和return区别?(return返回数据代表函数结束,yield返回数据但是会保存函数状态,在调用一次next后会从函数保存的状态继续下一次处理直道再遇到yield,yield会把数据一步一步加进来,而一般的迭代则是直接加载所有的信息在进行循环)

5.Python的list和dict区别和原理(涉及到了tuple和set)?(list是单元素列表底层是用C语言的指针数组实现的,所以插入和删除操作比较耗时但是索引很快,tuple是大小固定不可变只可以索引,这样更数组,dict是双元素键值对的数据结构底层是用哈希表对键进行映射,键无重复值可以重复,所以dict是无序的但是collection实现了OrderedDict,set集合是单元素的数据结构底层也使用了哈希表,元素不允许出现重复,因为重复元素多的话hash表的效率会有很大影响,会加深哈希冲突(增加了线性因子,降低了随机分布化)哈希就变味了)

6.Python的多线程和多进程说说?(多线程会加上一个GIL全局锁保证了线程的安全每个线程执行前必须获得GIL锁,同一时刻不管有多少cpu同一进程只能有一个线程执行适合IO密集型任务,是无法实现多核cpu的(java/c/c++可以利用多核cpu),python要利用多核cpu只能通过多进程实现,可以实现进程真正的并行,因为每个进程有各自的GIL锁互不影响!)

7.python多进程的实现?(在Unix/Linux下,可以使用fork()调用实现多进程。要实现跨平台的多进程,可以使用multiprocessing的Process和Pool模块。进程间通信是通过QueuePipes等实现的(实现生产者消费者模型)。)

8.Python全局解释器锁?(缺点:同一进程下每一时刻只能有同一个线程运行,因为线程要运行必须先获得全局GIL锁,实现不了线程的并行,只有进程的并行,因为进程之间的GIL锁是独立的。优点:避免了大量加锁的操作,维护了线程间数据安全的问题!)

9.同步锁,死锁,递归锁?(同步锁:当锁没有释放会一等待而不会离开,直到线程释放锁然后在获取锁!死锁:代码的嵌套使用,s1获得锁s2也获得锁,然后双方都在等待对方释放锁的过程!递归锁:改进了死锁,用了计数的方式来避免这种情况,当获取锁count+1释放锁count-1当计数为0才可获取锁。)

10.乐观锁,悲观锁?(乐观锁:假设不会出现并发冲突(死锁问题),只在提交数据时候进行检验。悲观锁:假设会出现并发冲突,在每一步都会检查数据!)

11.深拷贝,浅拷贝?(python中浅拷贝:可以看做是复制了一个对象本身,但是该对象内部引用的其他对象则不做复制,只是做了引用,深拷贝:深拷贝首先对外层对象进行拷贝,内层对象如果是不可变对象,则直接引用,对可变对象进行拷贝(浅拷贝只会拷贝对象的一层,深拷贝可以拷贝对象的所有层,与引用不同(全部都是指向同一块地址))和C++,java不同,浅拷贝就是引用指向同一块内存,深拷贝就是引用的内存进行了拷贝内存之间是独立的!深浅拷贝需要自己去实现而不像python中只需要copy或者deecopy(总结:python有引用和拷贝一层和拷贝全部层的概念(这是为了方便),c++和python有引用和自定义拷贝多少层的概念都要自己去实现)

12.装饰器讲讲?(就是给函数增加一个功能,只需要@实现的修饰函数,修饰函数是一个闭包(函数里面嵌套了一个函数,主函数返回的是嵌套的函数!),通俗点讲装饰器是对基本函数的修饰就是直接调用基函数即可底层实现了把基函数传入实现的修饰函数里,系统会自动调用闭包,来实现修饰功能!)

13.python的*args和**kwargs?(统称不定长参数,args是把参数打包成tuple,kwargs是把关键字参数打包成字典)

14.Python的协程?能并发吗?(协程本质上是线程,同一时刻同一进程只能有一个协程,底层是用yield生成器进行实现的,

,和线程一样遇到io就可以进行切换,可以实现并发!协程是基于python解释器进行调度的节省资源)

15.iterable和iterator的区别?(iterable是可迭代对象可以重复迭代只能for进行迭代,,iterator是迭代器对象只能迭代一次否则会报错通过next或for进行迭代,)

16.迭代器和生成器的区别?(迭代器是一个容器通过for或next进行迭代,而生成器通过yield(需要人工处理异常) 或者yield from(不需要人工处理异常) 实现了一个特殊的迭代器(基于把函数变为一个迭代器)。例子:range(1000)会返回一个长度为1000的数组,而xrange(1000)会返回一个生成器)

17.守护进程?守护线程?(主进程运行完毕是主进程的代码运行完毕,主线程运行完毕是在该进程内所有非守护线程运行完毕主线程才会运行完毕!守护线程是随着主线程运行完毕而结束!守护进程是随着主进程运行完毕而结束!)

18.join的作用?(子线程插队,获得cpu的调度权当子线程运行完毕后才会执行子线程,起到了阻塞作用!例如:多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个

猜你喜欢

转载自blog.csdn.net/taka_is_beauty/article/details/89117985