面试技术点分析(一)
1.数据类型有几种、有什么区别
列表 list
元组 tuple
字符串 string
数字 int,float,complex
布尔类型 True,False
字典 dict
集合 set
2.进程、线程、协程定义及区别
进程是操作系统进行资源分配和调度的基本单位,多个进程之间相互独立。
线程是CPU进行资源分配和调度的基本单位,它是比进程更小的能独立运行的基本单位
协程的调度完全由用户控制
区别
线程与进程的比较 1.线程是进程的一个执行单元,进程内至少有一个线程,在一个进程中线程是共享进程的资源,进程与进程之间相互不影响。 2.线程是CPU调度的基本单位,但进程不是 3.二者均可并发执行 4.线程不能独立执行,必须依存在应用程序中(进程) 协程与线程的比较 1.一个线程可以有多个协程,一个进程也可以单独拥有多个协程 2.线程与进程都是同步机制,而协程是异步 3.协程能保留上一次调用的状态
总结
在IO密集型一般使用多线程,CPU密集型使用多进程,强调非阻塞异步并发的一般都是使用协程
3.深浅拷贝的区别
浅拷贝是对原元素的引用,如果修改了原元素中的可变数据类型,拷贝之后的数据也会跟着改
深拷贝是原元素的数据拷贝,放入新开辟的内存地址,修改原元素对深拷贝之后的数据不会产生影响
4.常用设计模式
https://blog.csdn.net/wmj150731/article/details/81589659
5.函数式编程,对象式编程
函数式编程是从头写到尾,中间修改后面也要改(类似流水线生产,从头到尾)
对象式编程相当于组装多个功能,形成一个大功能(类似于把每个流水线生产好的部件在这里组装起来)
6.闭包、装饰器
闭包函数:定义在内部的函数引用外部函数的名字叫做闭包函数
7.名称空间的查找顺序
查找顺序:局部>>全局>>内置
函数在定义阶段就已经固定查找名字的顺序,不会因为函数的调用的位置改变而改变
8.python中的类可以多继承么,多继承的继承方式
可以,写多个父类就行
9.魔法方法,举例并说明
__init__ 初始化函数,在创建实例对象为其赋值时使用 __new__ 在__init__之前执行,真正的构造函数,并返回一个实例对象,当做参数self给__init__使用 __call__ 当调用一个对象的时候,就会触发类中的__call__方法
创建对象步骤
1.首先调用__new__得到一个对象 2.__init__为这个对象添加属性 3.将对象赋值给变量
10.生成器、迭代器、可迭代对象的定义及区别
可迭代对象:内置有__iter__方法的对象就是可迭代对象
迭代器:可迭代对象执行__iter__方法得到的结果就是迭代器,迭代器既有__iter__方法又有__next__方法
生成器:用户自定义的迭代器,内部加了关键字yield,yield后面的值必须调用__next__方法才能获得
重点:
迭代器一定是可迭代对象,可迭代对象不一定是迭代器
for循环的本质:将in后面的可迭代对象调用__iter__变成迭代器,调用__next__迭代取值
11.垃圾回收机制
引用计数:当内存中的数据没有任何变量名与其有绑定关系,就会被自动回收
标记清除:当内存快要被某个应用程序占满的时候,会自动触发清除
分代回收:根据存活的时间,划分不同的等级,等级越高的垃圾回收机制扫描的频率越低
12.线程安全、死锁、GIL
线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。存在竞争的线程不安全,不存在竞争的线程就是安全的
死锁:死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
GIL:全局解释器锁,不是python的特性,是cpython中的一个概念。在一个进程中所有线程的资源是共享的,为了保证线程的数据完整性,所以使用了GIL,每次只执行一个线程。
13.解决线程不安全的办法
抢票用多线程实现,可能出现多个用户买同一张票的情况
设置锁Lock,在处理数据之前抢到锁,处理完数据之后释放锁。
14.linux常用命令,举例说明
mv 移动文件 mv 源文件目录 目标文件目录 mv test3 test2 把test2文件移动到test3下 grep指令和管道符|使用 查看redis的进程号 ps -ef | grep redis 杀死进程 kill 进程号 cp拷贝指令 cp 原路径 目标路径
16.http状态码
http协议四大特性
1.基于请求和响应 2.基于TCP/IP之上作用于应用层的协议 3.无状态(服务端无法保存用户的状态) 4.无链接(请求来一次就响应一次,之后立马断开连接)
请求数据格式
请求首行(标识HTTP协议版本,当前的请求方式) 请求头(一大堆k,v键值对) /r/n 请求体(一些敏感信息)
五种响应状态码
1XX:服务端已经成功接收了你的数据正在处理,你可以继续提交额外的数据 2xx:服务端成功响应你想要的数据(请求成功200) 3xx:重定向(当你在访问一个需要登录之后才能访问的页面,你会发现窗口会自动调到登录页面) 301 302 4xx:请求错误(请求资源不存在报404,请求不合法不符合内部规定权限不够报403) 5xx:服务器内部错误(500)
17.http和https的区别
1.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 2.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 3.http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
18.网络编程、通信协议
19.三次握手、四次挥手
20.http中get 和 post的区别
21.缓存怎么做
就是把需要经常使用的数据提前放在某个地方,可以是本机的内存,也可以放在其他地方,这样做可以减少系统开销,提高系统效率。
22.session、cookie的区别
Session是保存在服务端,用来跟踪用户的状态
Cookie是保存在客户端的,用cookie来实现session跟踪的,第一次创建session的时候,服务端会告诉客户端,在cookie里面记录一个session ID,以后每次请求把这个ID发送到服务端就知道是哪个用户了。
23.socket/TCP /UDP/HTTP
1.osi七层协议:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
2.IP 协议对应于网络层,TCP协议对应于传输层,HTTP协议对应于应用层,三者从本质上来说没有可比性,socket则是对TCP/IP协议的封装和应用
3.TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据
4.socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API), 通过Socket,我们才能使用TCP/IP协议。
5.TCP之所以可靠是因为有反馈机制,TCP的三次握手举例,TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性
6.UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,正由于这些特点,使得UDP的开销更小数据传输速率更高