Python面试归纳
type
status
date
slug
summary
tags
category
icon
password
Python
gc要点
- python gc算法原理是?引用计数为主,标记清除和分代为辅
- 为啥单纯引用计数算法不行?因为引用计数无法解决循环引用问题
- 标记清除如何运作?可达性算法,从根对象出发,以引用作为有向边,DFS或BFS,未能标记上的对象作为要清除的对象
- 怎么分代回收?按经过的gc次数分类,分为新生代,中年代,老年代,新对象总是属于新生代,经过一定次数新生代gc后移动到中年代,以此类推
类
- 新式类和旧式类有什么区别?继承顺序不同,C3
- 什么是metaclass?有什么用处?metaclass是类的类,可以用来改变类的创建过程
- __new__和__init__的区别?
如何实现一个单例模式?
- 装饰器
- metaclass
- __new__方法
- staticmethod classmethod 和实例方法有什么区别?
- with背后是什么方法?__enter__ 和__exit__ 方法
- 装饰器的利弊?使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的
docstring
、__name__
、参数列表,不难发现,函数 f 被with_logging
取代了,当然它的docstring
,__name__
就是变成了with_logging
函数的信息了。好在我们有functools.wraps
,wraps
本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器里面的 func 函数中,这使得装饰器里面的 func 函数也有和原函数 foo 一样的元信息了
GIL
- 什么是GIL,有啥用?
- GIL对多线程 多进程有什么影响?
深拷贝浅拷贝
- 什么是深拷贝?什么是浅拷贝?[:]是浅拷贝,
总结:Python函数传递的是对象的引用值,非传值或传引用。但是如果对象是不可变的,感觉和c语言中传值差不多。如果对象是可变的,感觉和c语言中传引用差不多。
- python是传值还是传参?共享引用,这个问题取决于参数是可变对象还是不可变对象,在函数内对可变对象修改时对象值会变,对不可变对象修改时则是重新赋值
装饰器
- 什么是装饰器?用来做什么?
- 装饰器的原理是什么?
- 写一个简单的含参装饰器并打印被装饰函数的名字?
生成器
- 什么是生成器?有什么利弊?
cpython源码
- 描述一下dict的插入和删除过程?
- python的int有大小限制吗?为什么?
- python是如何进行内存管理的?
语言问题
- 进行for遍历到结尾的时候,是如何停止的?
操作系统
os
- 进程 线程和协程有什么异同?
- 互斥锁和自旋锁的区别?
- 堆和栈的区别?
内存管理
进程管理
IO管理
机组
计网
- OSI 7层网络模型?
- TCP与UDP的区别?
- TCP连接和断开过程?(3次握手 4次挥手)
- 了解TCP半连接吗?
- TCP粘包了解吗?如何处理?
- 从输入网址到页面显示的过程?
- 什么是socket?
- BIO NIO AIO了解吗?
- select与epoll的区别?
数据库
- redis的数据类型及其底层数据结构
- 如何使用redis实现分布式锁
- mongodb是CAP的哪种
- mysql的索引类型
- mysql的隔离界别
- 什么是幻读?默认隔离级别会发生幻读吗?
Redis
MySQL
MongoDB
MQ
RabbitMQ
Docker&K8S
docker image中的 layer 是什么?
docker image 是由 dockerfile创建的,dockerfile 中每行表示一个 layer,所有上层的改动都会传递影响到下一层
可考虑将多个命令行合并到一行减少image 大小
所以尽量把频繁变动的命令放后面执行,以复用底层 layer 减小 image size