python实战面试题目
1、列出你知道的http协议的状态码,说出表示什么意思?
- 1xx临时响应
- 2xx 成功
- 3xx重定向
- 4xx 请求错误
- 5xx服务器错误
我经常遇到的:200成功、404未找到网页文件、403服务器拒绝请求(禁止)、304未修改(自从上次请求后该网页就未修改过)、500服务器内部错误、503服务器请求超时。
2、http和https的区别(简单来说就是一个不加密一个加密)
HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)
(1)HTTP :HTTP是超文本传输协议,它本身不提供加密功能,数据在传输过程中以明文形式进行,因此存在被截获或篡改的风险。
(2)HTTPS :HTTPS是HTTP的安全版本,它使用了SSL(安全套接层)/TLS(安全传输层协议)来对传输的数据进行加密,确保数据在传输过程中的安全性和完整性。
3、聊聊scrapy框架的了解?由那些组成?你一般写爬虫用的是requests还是scrapy?为什么不用scrapy?他两的优势是什么?
scrapy 是一个python爬虫框架,由下面6个部分组成:
引擎 - 负责整个系统的数据处理流程
蜘蛛程序 - 用户自定义抓取特定的网页url和解析规则的模块
调度器 - 将要处理的url列入队列中
下载器 -抓取网页内容返回响应
数据管道 -对数据进行清洗、验证和存储
中间件 - 提供用户自定义代码来拓展scrapy功能,氛围下载中间件和蜘蛛中间件。
数据处理流程:
引擎询问蜘蛛程序要爬取哪个网页,通过调度器列入队列中,然后引擎再通过下载中间件调用下载器拿取网页内容返回响应给引擎,引擎调用蜘蛛程序,,拿到数据条目,通过蜘蛛中间件将数据通过数据管道保存到数据库中。
requests
scrapy相对于requests太复杂,处理验证码以及反爬都不如自己写的调用requests库代码好处理。
4、对于验证码,你是怎么操作的?
图形验证码操作
5、redis有那些数据类型?redis 为什么快?
redis有16个数据库,从0-15
redis有五大基本数据类型:String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合)、Hash(哈希)
快?
内存存储,将数据存储在内存中而不是磁盘当中,读写速度快
采用单线程操作,避免了多线程并发带来的锁竞争操作
高效的数据结构和算法,采用哈希,键值对,检索速度更快
采用内存淘汰策略,数据存储在内存之中内存有限,会清理不用或者不常用的数据
采用非阻塞I/O模型,数据没有准备好会被返回,不会发生线程堵塞
6、tcp协议和udp协议?使用场景?
tcp和udp都工作在传输层,在程序之间传递数据
tcp 安全可靠,基于连接,稳定性强,比如发送邮件,浏览网页等
udp 不安全不可靠,基于非连接,容易丢包,资源占用少,性能损耗少,传输速度快,比如语音通话、视频通话等
tcp传输确认:三次握手四次挥手?
三次握手为了解决网络通道不可靠的问题
三次握手:客户端向服务端发起连接时会发送SYN包询问能否建立连接,服务端收到包后如果同意连接,就会发送SYN+ACK包给客户端,客户端收到后发送ACK包建立连接。
四次挥手:客户端向服务端发送FIN包请求终止链接,进入等待状态(1),服务端收到后发送ACK包给客户端,进入关闭等待状态(2),客户端收到ACK包后,服务端再发送FIN包进行确认是否终止连接(3),客户端收到后发送ACK包给服务端进入超时等待状态之后关闭,但是服务端一收到ACK包就会关闭(4)。
7、多线程?多进程?在什么情况下开多线程?
进程是一个程序正在运行,没有运行的代码叫做程序,多个进程之间内存独立、互不干扰,而多线程,线程是依赖进程而存在的,一个进程至少有一个主线程,线程与线程之间数据可以共享。
场景:多线程用于I/O密集型任务,比如说网络请求,运行浏览器是一个进程,浏览里面的多个网址相当于多线程,还有文件读写等。
多进程适用于CPU密集任务
8、python的GIL锁?
全局解释器锁
限制多线程同时执行,确保同一时刻只有一个线程在执行。
9、深浅拷贝?(前面笔记有,记得不够扎实),python数据容器的特点?
深拷贝就是根据原来的对象复制一个新的对象,新对象与原来的对象之间完全独立,互不干扰,不共用一个内存地址。浅拷贝就是复制对象的属性,如果说浅拷贝复制的是引用类型,那么会改变原来对象的值。
python数据容器有字典、列表、集合、元组、字符串
(1)列表list的特点:
[元素1,元素2....]
列表里面的元素能够重复,可以被修改,从前往后下标从0开始,从后往前下标从-1开始,可以通过下标获取元素值,支持for循环和while循环,有序可以容纳不同的数据类型
(2)字典dict的特点:
{key1:value1,key2:value2.......}
key和value可以是任意数据类型,key不允许被重复,字典通过key来检索value,不能通过下标,可以容纳多个数据类型,每一份数据是key、value键值对,可以被修改,支持for循环,不支持while循环。
(3)集合set的特点:
{元素1,元素2...}
集合不能够重复,支持for循环,不支持while循环因为不支持下标索引,无序存储,不支持while循环,支持for循环,可以修改,容纳多个数据可不同数据类型。
(4)元组的特点
(元素1,元素2,.....)
元组不能够被修改,容纳多个数据和不同数据类型,有序可重复,支持for循环和whie循环。
(5)字符串的特点
只可以存储字符串,长度取决于内存大小,支持下标索引,允许重复。
10、字典的查询速度比列表查询速度快的原因?
是因为字典查询机制基于哈希表,通过键来查询值,不需要遍历整个字典,而列表如果不知道索引值就需要遍历整个列表。
10、装饰器?
11、聊聊数据绑定的原理?数据劫持
vue中的数据双向绑定使用v-model,用户表单输入数据(表单、文本框等)和数据源,比如说mysql数据库捆绑在一起。说白了原理就是数据劫持,数据从用户那边传过来,被一段代码给劫持了,对其进行修改操作或者检查。就相当于一个检查站,对传过来的数据进行检查和修改。
数据绑定是一种技术,它允许开发者将用户界面的元素(如输入框、标签等)与数据源(如JavaScript对象、数据库等)连接起来。数据绑定就是实现数据源与界面元素之间同步的“桥梁”。
12、javaScript中let和var的区别
var可以是全局变量也可以是局部变量,javaScript中var定义在函数外边全局变量,定义在函数里面,也就是代码块中,就是局部变量。全局变量的生命周期是整个页面关闭就结束,而局部变量则是代码块运行完毕就结束了。
两个都是用来定义变量的,但是let定义的变量只在定义的代码块中生效,并且只能定义一次,不能重复声明