作者的话
以下面试题均为个人面试过程中遇到的较为频繁的一些题目,仅记录以供学习,若是要深入理解,建议各位查阅资料或者翻看文档源码,以上。
python基础理论
1.is 和 == 的区别?
‘is’被叫做同一性运算符,也就是对象的id,查看对象的唯一身份标识是否一致。
‘==’为比较操作符,判断两对象的值是否相当。
2.*args,**kwargs分别是什么?
args实际上是arguments的缩写代表位置参数,kwargs是keyword arguments的缩写代表关键字参数,*args是把参数打包成一个元组供函数调用,**kwargs就是把参数打包成字典供函数调用,值得注意的是,传参的顺序不能改变,位置参数必须在关键字参数的前面。
3.dict的存储结构是什么?时间复杂度是?
dict的存储结构是哈希表,时间复杂度为O(1)。
python3.6之前的dict存储方式是一张hash表,根据规则(哈希函数)计算出key的hash值,再与mask操作(字典最小长度-1)得到一个index,在位置冲突时先判断两key是否相等,相等则更新,否之下移寻找空位。python3.7之后新增了一个indices列表,首先计算key的hash值,与mask操作之后得到的index为插入indices的下标,由下标可以得到indices中的len(enteies),表示的是该值在enteies表的位置。解决冲突的方式与3.6之前一致。
4.middleware的作用?
middleware是介于request和response之间的一个处理过程,用于全局范围的改变django的输入与输出。例如django默认开启csrf中间件,每次请求都会验证是否有正确的token等。
5.线程,进程,协程的区别及作用?
进程就是一个运行的程序,是操作系统分配资源的最小单位,线程是CPU调度的最小执行单位,一个进程有且仅有一个主线程,一个进程有多个线程,一个线程仅有一个进程。协程本质上就是一个可由用户程序进行上下文切换的线程。
6.深拷贝浅拷贝的区别?
浅拷贝是对对象地址的引用,深拷贝开辟了新的内存空间。
7.类方法,实例方法,静态方法的区别?
类方法使用@classmethod装饰器,第一个参数必须是当前类对象cls,通过它来传递类属性和方法(不能传实例的属性和方法),实例对象,类对象皆可调用。
实例方法第一个参数必须是实例对象self,通过它来传递实例的属性和方法(也可以传类的属性和方法),只能由实例对象调用。
静态方法使用@staticmethod装饰器,参数随意,但是方法体内不能出现类或实例任何属性以及方法,类对象实例对象皆可调用。
8.GIL是什么?每个线程都有GIL吗?
GlobalInterpreterLock(全局解释器锁)
Python代码的执行由Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。
不是每个线程都有GIL。
9.python的内存管理制度?
引用计数、垃圾回收、内存池机制
10.python有哪些魔法方法?
__init__ # 初始化方法
__new__ # 构造函数 在__init__之前被调用,用来构造对象
__del__ # 释放资源
__str__ # 定义当str()被调用
__repr__ # 定义当repr()被调用
计算机网络
1.访问一个网址到接收页面响应的过程,计算机网络经历了哪些过程?
输入网址——游览器查找域名网址的ip——游览器给web服务器发送一个http请求——web的永久重定向响应——游览器跟踪重定向的地址——服务器处理请求——游览器发送获取的html页面
简单来说:
域名解析——建立TCP连接——客户端向服务端发起get请求——服务器接收请求返回页面
2.TCP为什么是可靠连接?
TCP保持可靠性的规则:TCP在数据传输中将数据分为多个信息包,信息包携带一个校验码,接收方收到信息包之后将校验码与信息包中的内容核对,若是不一致则丢弃,信息包发送方将在收到接收方的反馈后停止发送该信息包,否之持续发送直到收到反馈或者收到网络异常等的反馈,tcp发送每个信息包送之后都会发送一个序号,接收方可根据序号将信息包组成完整的数据,也以此忽略已接收的信息包。
3.CDN是什么?
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
4.计算机七层网络结构是什么?分别有哪些协议?
python实操
1.实现一个带参数的装饰器
def outer(fn)
def inner(*args,**kwargs)
fn()
print('this is a decorater')
return inner
@outer
def func()
pass
2.实现一个单例模式
class Example(object):
__state = None
def __init__(self,name):
self.name = name
def __new__(cls,*args,**kwargs):
if not __state:
__state = super().__new__(cls)
return cls.__state
else:
return cls.__state
3.正则匹配一个邮箱
import re
re.match(r'^[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}$',text):
Linux
1.查看进程资源占用
ps -aux | grep xx进程号
2.查看端口占用
netstat -anp | grep xx端口号
3.查看文本文件内容
cat
4.查看进程运行情况
ps
或
top
5.查看磁盘使用情况
df
6.监控虚拟内存 进程 cpu活动
vmstat
Git
1.切换分支
git checkout xx分支名
2.解决冲突
冲突情况:
情景一:多个分支代码合并到一个分支时;
情景二:多个分支向同一个远端分支推送代码时;
解决办法:
情景一:在当前分支上,直接修改冲突代码—>add—>commit。
情景二:在本地当前分支上,修改冲突代码—>add—>commit—>push
算法
1.快排等排序算法实现
2.使用生产者消费者模式,实现一个生产者线程随机生产一个字符,三个消费者线程记录生产的字符出现的次数。
数据库
1.提升查询速度有哪些措施?
建立索引,优化查询语句,分表分库,增加cache层。
2.mysql有哪些引擎?
InnoDB MEMORY MyISAM ARCHIVE
3.innoDB为什么使用B+tree作为存储结构?
在B+树中,其非叶子的内部节点都变成了key值,因此其内部节点相对B 树更小。如果把所有同一内部节点的key存放在同一盘块中,那么盘块所能容纳的key数量也越多。一次性读内存中的需要查找的key值也就越多。相对来说IO读写次数也就降低了。
每次查询的时间复杂度是固定的
在B+树中,由于分支节点只是叶子节点的索引,所以对于任意关键字的查找都必须从根节点走到分支节点,所有关键字查询路径长度相同,每次查询的时间复杂度是固定的。但是在B树中,其分支节点上也保存有数据,对于每一个数据的查询所走的路径长度是不一样的,所以查询效率也不一样。
遍历效率更高
由于B+树的数据都存储在叶子节点上,分支节点均为索引,方便扫库,只需扫一遍叶子即可。但是B树在分支节点上都保存着数据,要找到具体的顺序数据,需要执行一次中序遍历来查找。所以B+树更加适合范围查询的情况,在解决磁盘IO性能的同时解决了B树元素遍历效率低下的问题。
4.事务的四个特性?
原子性,一致性,隔离性,永久性
最后,有些比较简单基础的概念性名词不做多的赘述。如有错误的地方,欢迎提出!