1、介绍一下HTTP协议的四大特性?
基于TCP/IP作用于应用层之上
基于请求响应
无状态
短连接
2、介绍一下Python常用的Web框架?
django
大而全,自带的功能组件非常多,但有时过于笨重
Falsk
小而精,自带的功能非常少,但第三方模块非常的多,缺点,比较依赖第三方开发者
tornado
异步非阻塞,速度非常的快
3、介绍一下最左匹配原则?
使用联合索引时需符合最左前缀匹配原则,where条件中存在联合索引中最左边的字段则说明命中了联合索引
4、互联网两大开发架构是什么?
C/S架构 : 客户端与服务端
B/S架构 : 浏览器与服务端(本质C/S)
5、Python中实现多任务的3种方式,并分别介绍一下
开启多进程 : from multiprossing import Process
开启多线程 : from threading import Thread
开启协程 : import gevent, 或者使用 yield 模拟协程, 应用层面控制单线程内多个任务之间来回切换
6、什么是lambda函数,说明其使用场景
没有名字的函数
应用场景 : 临时使用一次,通常与其他函数配合使用
max(),min(),sorted(),map(),reduce(),filter(),
7、介绍一下面向对象三大特性
继承 : 子类继承父类, 拥有父类中的属性和方法
封装 : 隐藏对象的属性和实现的细节, 值对外提供公共访问的接口
为什么使用 : (隔离复杂度,提高安全性,内部数据完整性,代码的复用性)
原则 : 对外提供公共方法,把不需要对外提供的功能隐藏
多态 : 事物的多种状态, 比如动物类有人,猪,狗
8、CBV源码简述
从as_view()入手--->是一个类方法---->内部view函数---->并返回view引用(就是一个闭包函数)
路由层改写 views.view ,与原来使用视图无异
再看view内部self=cls(...)生成一个自定义对象--->返回self.dispatch(...)
对象中无该方法--->类(无)--->父类---->找到dispatch()
再看dispatch(...)---->判断请求方法是否在八种常用方法中--->在,gatattr()方法获取self的请求方法(假设我们以get请求)---->显然self里面有get方法(我们自己写的)---->于是拿到get方法的内存地址赋值给handler---->最后dispatch()返回handler()---->也就是执行了get方法(就达到了自动触发get方法的目的)
9、常用的响应状态码
1xx:服务端正在处理请求,可以继续发送请求
2XX:响应成功,200 ok
3XX:重定向,比如访问一个需要登入的网站,它会将你重定向到登入界面
4xx:请求错误,比如403,当前请求不符合条件(没有权限),404请求资源不存在
5XX:服务器内部错误,无法完成请求
企业自定义状态码一般1000以后
10、Django5种转换器
str : 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int : 匹配正整数,包含0。
slug : 匹配字母、数字以及横杠、下划线组成的字符串。
uuid : 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path : 匹配任何非空字符串,包含了路径分隔符(/)(不能用?号)
11、介绍一下反射以及实现反射的内置函数
以字符串的形式来操作对象的属性或方法
getattr(obj,str):获取对象的属性或方法
hasattr(obj,str):判断对象是否有该属性或方法
setattr(obj,key,value):设置对象的属性或方法
delattr(obj,str):删除对象的属性或方法
模块反射mode = __import__(str)
以字符串方式导入模块的模块 : importlib, 使用 : mode = importlib.import_module(str)
12、介绍一下单例模式
它是一种设计模式
确保某一个类只有一个实例,也就是每次实例的结果都是同一个对象,用于节省内存
应用场景 :
比如从配置文件中读取配置来进行实例化,在配置相同的情况下就没必要重复的产生对象来浪费内存
单个资源占用过多的对象,比如数据库
13、实现单例模式的几种方式
实现方式 :
模块是天然的单例模式,首次导入执行文件,生成.pyc的文件,下次导入直接加载.pyc文件
基于类装饰器实现
基于类的绑定方法
基于__new__方法实现
基于元类中__call__方法实现
14、介绍一下GIL锁
全局锁,Python解释器锁
它是CPython解释器独有的一个特性
它保证了Python解释器在同一时间内只有一个任务(线程)正在运行,也就无法使用多核优势
15、介绍一下Python的垃圾回收机制
采用引用计数的技术,直接或间接引用,技术加1,删除引用等引用计数减1,计数0则回收,带来的问题 :
1.循环引用的问题:容器类型都有可能产生循环引用,(比如两列表相互引用)
2.效率问题:每次扫描全表,效率低
解决方法:
1.标记清除:应用程序的内存空间耗尽,GC停止整个程序做两件事,先标记,再清除
标记:从栈区出发能直接或间接引用的标记(栈区,变量名与值地址对应关系,堆区,真正的数据)
清除:没有标记的就是没有被引用的,清除
2.分代回收:新生代,青春代,老年代,往上GC扫描频率降低(因为权重高,因为GC多次都没有被回收)
整体扫描此时降低,提升效率,但有些升级到老年代就立马没有引用了(那么就是垃圾)
也就是说分代回收允许一些垃圾不被及时回收的情况下提升效率(以空间换时间的策略)
16、例举几种几种PEP8规范
1.函数,类定义上下空两行
2.函数参数逗号后空一格
3.注释在代码上方#号空格再写,在后方先空两个#号空格再写(错误的注释不如没有)
4.变量名尽量见名知意,字母数字下划线,驼峰体,不能数字开头,不能关键字命名
5.赋值符号左右空一格
6.一行代码字符不超过80个,url例外
7.函数不超过30行,类不超过200行,py文件不超过500行
......
17、is 和 == 的区别
is : 比较id,(Python中id接近于内存地址)
== : 进比较值相等
18、简述一下Python中的字符串驻留机制
对于一个短字符串,对其赋值多个变量名,指向的是同一个内存地址(引用)
python中小整数池 : -5~256
19、熟悉with语句吗?介绍一下其实现原理
with上下文管理
可以自动的操作(创建/获取/释放)资源,如文件操作、数据库连接
上下文管理协议就是 with 语句, 为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__()和__exit__()方法
with 对象,触发对象的__enter__的执行
在with同一级别写代码, 脱离了with,就会执行 __exit__
20、如何实现深拷贝?
import copy
copy.deepcopy(list)
21、浅拷贝和深拷贝的区别?
比如两个列表
1.浅拷贝将源列表的第一层的可变和不可变类型不加以区分的进行拷贝,产生新的列表新的内存地址,但是数据指向的还是原来的内存地址,如果有子列表,修改子列表内的数据会对源列表数据产生影响
2.深拷贝将源列表里面的数据加以区分的进行拷贝,相当于是递归的拷贝,两个列表是完完整整的相互独立互不影响
22、__new__()
、__init__()
的区别
__new__(): 先触发,产生一个空对象
__init__():后触发,对空对象进行初始化
23、Python中如何函数式编程?
Python中常用的函数式编程
map() : 映射
filter() : 过滤
reduce() : 合并
zip() : 拉链函数,列表元素一一对应组成一个个元组,返回元组列表
24、1 or 2 与 1 and 2 的结果?
1 : 短路运算(偷懒原则)
2 : 必须全部满足True
25、如何在函数中修改全局变量?
关键字 : global 声明
ps : 函数 : globals() : 查看全局作用于中的名字绑定关系
26、在for循环一个可迭代对象的时候如何实现顺便打印索引
for i,v in enumerate(list)
27、什么是MRO?
属性查找顺序列表
28、介绍一下ARP协议?
同一子网内发包给所有端口: 源ip,目标ip,源mac,ff:ff:ff:ff:ff:ff, 对方收到返回mac
不同子网,直接 源ip,网关ip,源mac,ff:ff:ff:ff:ff:ff,网关返回mac,再发包 源ip,目标ip,源mac,网关mac,网关在转发给路由一层层往外
29、如何实现多进程、多线程、协程
开启多进程 : from multiprossing import Process
开启多线程 : from threading import Thread
开启协程 : import gevent, 或者使用 yield 模拟协程, 应用层面控制单线程内多个任务之间来回切换
30、任务的三种状态以及提交的两种方式
阻塞态,运行态,就绪态
同步 : 发送端等待接收端响应才进行下一个任务
异步 : 发送端不等待接收端响应,只通知一下就直接进行下一个任务,并发提升
31、介绍一下异步和同步
同步 : 发送端等待接收端响应才进行下一个任务
异步 : 发送端不等待接收端响应,只通知一下就直接进行下一个任务,并发提升
32、介绍一下什么是触发器、存储过程、视图?
触发器 : 在对一个数据增删改前后设置一些操作,满足条件后就会自动触发这些操作执行,没有查操作
存储过程 : 类似于Python中的自定义函数,里面放一堆的SQL语句,调用存储过程名则执行里面的语句
视图 : 通过sqly语句查询出来的一张虚拟表,把他做成视图,下次使用就不在需要繁琐的SQL语句,视图只有数据结构,真实的数据还是原来的表
33、什么是事务?
事务就是一条或多条SQL语句组成的逻辑单元,让我们在一系列操作中因为某些操作失败,而导致数据的不正确性提供了回滚的功能(回到原来的状态)
34、事务的四大特性?
a原子性 : 事务不可再分,要么全部执行成功, 要么一个都无法执行成功
c一致性 : 事务从一个一致性状态, 变成另一个一致性状态,与原子性密不可分
i隔离性 : 多个事务的执行互不干扰, 任意一个事务的内部操作对其他并发的事务, 都是隔离的
d持久性 : 指事务一旦提交, 对数据的任何改变都记录到永久存储器中, 通常是物理硬盘
35、Django请求生命周期
web浏览器---->web网关接口(wsgi)---->中间件(从这里开始才是真正的Django框架)---->路由层(路由匹配,触发视图)----->视图层(视图函数的执行)---->模板层----->视图层(页面渲染)---->模型层---->db(拿数据)---->模型层---->视图层----->路由层---->中间件---->web网关接口---->web浏览器
web网关接口 : HTTP请求来封装,HTTP响应走封装
36、如何取消URL自动加斜线结尾?
settings.py 中配置 : APPEND_SLASH = False (slash:斜杠)
37、介绍一下ORM?
对象关系映射 (object relation map)
Django中的一个操作数据库的框架,让不懂数据库语法的人在有Python基础的条件下操作数据库
类---->表
对象--->数据行
属性--->字段
38、Django自带的数据库是什么?
SQlite
39、模版语法进行传值的时候需要注意什么?
可以支持Python的基本数据类型
在传函数及类的时候会自动加括号调用
传函数时不支持额外的传参
40、已经存在自定义的数据库表,如何实现与Django项目进行关联?
1.方式一 :
python3 manage.py inspactdb
然后复制代码
2.方式二 :
python3 manage.py inspactdb > [app名称]models.py # 重定向到models文件
41、介绍一下你知道的前端框架?
js 的 Jquery
Bootstrap
vue
42、介绍一下装饰器的原理?
为函数添加新功能的函数,符合开放封闭原则,基于闭包函数实现
写在被装饰函数正上方一行,会将函数名当做参数传入装饰器函数
43、什么是闭包函数?
定义在函数内部的函数
内部函数对外部作用于有引用
44、介绍一下Python中的名称空间与作用域?
名称空间 : 存放名字与值绑定关系的地方
内置名称空间 : 存放Python内置的名字
全局名称空间 : 存放py文件顶格定义的名字
局部名称空间 : 存放函数内定义的名字
全局作用域 : 根据名称空间的范围和特点进行归类(全局存活,全局有效)
内置名称空间
全局名称空间
局部作用域 : 临时存活,局部有效
局部名称空间
45、有关于名称空间与作用域的两个内建函数?
全局名称空间名字对应关系 : globals()
局部名称空间名字对应关系 : locals()
46、在进行模版语法传值的时候,如果需要传递多个变量的时候,我们可以使用什么来进行一键传递?
locals()传入当前作用域中所有的变量