python面试题及解析
1.python基础
1.Python和Java、PHP、C、C#、C++等其他语言的对比?
答:
2.简述解释型和编译型编程语言?
答:解释型语言,在运行时才进行翻译,每条语句都是执行时才进行翻译,效率比较低;
编译型语言,执行前需将高级语言编译成机器语言,翻译只做一次,执行效率较高;
3.位和字节的关系?
答:位,数据传输单位;字节,数据存储单位;
4.b、B、KB、MB、GB 的关系?
答:B->GB为1024关系;1B=8bit
5.通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”
int("0b1111011",base=2)
十进制转换成二进制:v = 18
bin(18)
八进制转换成十进制:v = “011”
int("011",base=8)
十进制转换成八进制:v = 30
oct(30)
十六进制转换成十进制:v = “0x12”
int("0x12",base=16)
十进制转换成十六进制:v = 87 hex(87)
6.请编写一个函数实现将IP地址转换成一个整数。
7.python递归的最大层数?
答:由sys.setrecursionlimit()设置;
8.求结果:
v1 = 1 or 3
1
v2 = 1 and 3
3
v3 = 0 and 2 and 1 0
v4 = 0 and 2 or 1 1
v5 = 0 and 2 or 1 or 4 1
v6 = 0 or Flase and 1 False
9.ascii、unicode、utf-8、gbk 区别?
答:ascii ,美国制定了一套字符编码,对英文字符与二进制之间做了联系,这被称为ASCII码;
unicode,所有符号的编码;
utf-8,它是一种变长编码,可以使用1-4个字节表示一个符号,根据不同的符号来变化字节长度;
gbk,GB2312的扩展,完全兼容GB2312;
10.字节码和机器码的区别?
答:机器码,名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。
11.三元运算规则以及应用场景?
答:在赋值变量的时候,可以直接加判断,然后赋值
12.列举 Python2和Python3的区别?
答:
13.用一行代码实现数值交换:
a = 1
b = 2
答:a,b = b,a
14.Python3和Python2中 int 和 long的区别?
答:3中没有long
15.xrange和range的区别?
答:xrange返回的是一个生成器对象;
16.文件操作时:xreadlines和readlines的区别?
17.列举布尔值为False的常见值?
答:None,False,所有为0的数,“”,[],(),{};
18.字符串、列表、元组、字典每个常用的5个方法?
答:字符串,strip、lstrip、rstrip、count、center、find、index、replace、capitalize、startwith、endwith、split、rsplite、join
列表,append、insert、extend、pop、del、reverse、sort、len、max、min、count、index、sorted、insert
字典,get、pop、len、del
19.lambda表达式格式以及应用场景?
答:lambda argument_list:expression
filter、sorted、map、reduce、作为参数传入
20.pass的作用?
答:作为空语句,保持程序结构的完整性,不做任何事情,一般用于做占位语句
21.*arg和**kwarg作用?
答:python的两个可变参数,*arg代表多个无名参数,类型未tuple,**kwargs表示关键字参数,为dict使用时需要将*rag放置在**kwargs之前,否则会报错;
22. is和==的区别
答:is判断id是否相同,==判断值是否相同
23.简述Python的深浅拷贝以及应用场景?
答:浅拷贝是只仅仅拷贝数据集合的第一层数据,深拷贝指的是拷贝数据集合的所有层。所以对于只有一层的数据几个来说深浅拷贝的意义是一样的,如字典、元祖、集合、列表等。对于数字和字符串而言,无意义,因其永远指向一个内存地址。
24.Python的垃圾回收机制?
25.Python的可变类型和不可变类型
答:可变类型,列表、字典、可变集合;不可变类型,数字、字符串、元组、不可变集合
26.求结果:
v = dict.fromkeys(['k1','k2'],[]) v[‘k1’].append(666) print(v) v[‘k1’] = 777 print(v)
答:{“K1”:[666],"K2":[666]} {“K1”:777,"K2":[666]}
27.求结果
def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()])
答:[6,6,6,6]
28.列举常见的内置函数?
答:map、reduce、filter、sort
29.filter、map、reduce的作用?
答:filter,筛选;map,生成新序列;reduce,累加;
30.一行代码实现9*9乘法表
答:
print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
31.如何安装第三方模块?以及用过哪些第三方模块?
答:①pip install model_name;②python setup.py insyall;
32.至少列举8个常用模块都有那些?
33.re的match和search区别?
答:match只检测开头,search检测整个字符串;
34.什么是正则的贪婪匹配?
答:贪婪匹配,趋向于最大长度;非贪婪匹配,匹配到结果就好,就少得匹配字符;
35.求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
答:[0,1,0,1,0,1,0,1,0,1],(0,1)
36.求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
答:1,2,False,True
37.def func(a,b=[]) 这种写法有什么坑?
答:函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,第二次执行还是用第一次执行的时候实例化的地址存储,所以三次执行的结果就是 [1, 1, 1] ,想每次执行只输出[1] ,默认参数应该设置为None。
38.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
答:split
39.如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
答:eval([‘1’,’2’,’3’])
40.比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
41.如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
答:
[x*x for x in range(1,11)]
42.一行代码实现删除列表中重复的值 ?
set(list)
43.如何在函数中设置一个全局变量 ?
答:global
44.logging模块的作用?以及应用场景?
45.请用代码简答实现stack ;
答:
calss Stack(object): def __init__(self): self.stack = [] def push(seld,value): self.stack.append(value) def pop(self): if self.stack: self.stack.pop() else: raise LookupError("stack is empty!") def is_empty(self): return bool(self,stack) def top(self): return self.stack[-1]
46.常用字符串格式化哪几种?
答:①%s;②%(first)s;③format;
47.简述 生成器、迭代器、可迭代对象 以及应用场景?
答:生成器,函数体中有yield关键字的函数;
迭代器,一个可以记住遍历位置的对象;__iter__()返回一个特殊地迭代器对象,__next__()返回下一个迭代器对象
48.用Python实现一个二分查找的函数。
答:
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset,find_num): if len(dataset) > 1: mid = int(len(dataset) / 2) if dataset[mid] == find_num: # find it print("找到数字", dataset[mid]) elif dataset[mid] > find_num: # 找的数在mid左面 print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid]) return binary_search(dataset[0:mid], find_num) else: # 找的数在mid右面 print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid]) return binary_search(dataset[mid + 1:], find_num) else: if dataset[0] == find_num: # find it print("找到数字啦", dataset[0]) else: print("没的分了,要找的数字[%s]不在列表里" % find_num) binary_search(data,20)
49.谈谈你对闭包的理解?
答:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
50.os和sys模块的作用?
答:os,提供一种方便的使用操作系统的函数的方法;
sys,可供解释器使用或维护的变量和解释器进行交互的函数;
51.如何生成一个随机数?
答:使用random函数;
55.如何使用python删除一个文件?
答:os模块,os.remove,os.removedirs(path),os.rmdir(path)
56.谈谈你对面向对象的理解?
答:所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。封装是我们所说的面相对象编程的特征之一。除此之外还有继承和多态。
57.谈谈你对面向对象的理解?
58.Python面向对象中的继承有什么特点?
答:建造系统中的类,避免重复操作;新类是基于已经存在的类,这样可以提升代码的复用程度
59.面向对象深度优先和广度优先是什么?
答:
60.面向对象中super的作用?
答:用于调用父类的一个方法
61.是否使用过functools中的函数?其作用是什么?
答:用于高阶函数,指那些作用于函数或者返回其他函数的函数。通常情况下,只要是可以被当做函数调用的对象就是这个模块的目标。
62.列举面向对象中带爽下划线的特殊方法,如:__new__、__init__
63.如何判断是函数还是方法?
答:函数,函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用。
方法:方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作,使用时采用点方法。
64.静态方法和类方法区别?
答:都可以通过实例或者类调用,不过实例方法通过类调用时需要传递实例的引用;
65.列举面向对象中的特殊成员以及应用场景
答:__doc__描述类的信息
__call__对象后面加括号,触发执行
__dict__查看类或对象的所有成员
__str__打印对象时,默认输出该方法的返回值
__getitem__,__setitem__,__delitem__用于索引操作,如字典,分别表示获取,设置,删除数据
__new__,__metaclass__
66.1、2、3、4、5 能组成多少个互不相同且无重复的三位数
答:
67.什么是反射?以及应用场景?
答:核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动
68.metaclass作用?以及应用场景?
答:MetaClass是用来创建类的,就好比类是用来创建对象的。如果说类是对象的模板,那么metaclass就是类的模板。
直接将需要的属性全部作为新组合类的成员列出来;
分别将各个独立的属性集定义成单个的类,然后通过在组合类添加每个属性类的实例(instance)的方式来引用各个属性类中定义的属性;
69.用尽量多的方法实现单例模式。
答:
#模块单例 #fool.py class Singleton(object): def foo(self): pass singleton = Singleton() #foo.py from fool import singleton
#静态变量方法 class Singleton(object): def __new__(cls,a): if not hasattr(cls."_instance"): cls._instance =object.__new__(cls) return cls._instance def __init__(self,a): self.a=a def aa(self): print(a) a=Singleton("a")
class Singleton1(type): def __init__(self, *args, **kwargs): self.__instance = None super(Singleton1,self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs): if self.__instance is None: self.__instance = super(Singleton1,self).__call__(*args, **kwargs) return self.__instance class Singleton2(type): _inst = {} def __call__(cls, *args, **kwargs): print(cls) if cls not in cls._inst: cls._inst[cls] = super(Singleton2, cls).__call__(*args) return cls._inst[cls] class C(metaclass=Singleton1): pass
def singleton(cls, *args, **kw): instance = {} def _singleton(args): if cls not in instance: instance[cls] = cls(*args, **kw) return instance[cls] return _singleton @singleton class A: pass
70.装饰器的写法以及应用场景。
答:python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)
①授权;②日志;③带参数的装饰器;④在函数中嵌入装饰器;⑤装饰器类
71.异常处理写法以及如何主动跑出异常(应用场景)
答:
try: pass except Exception as e: print(str(e)) else: pass finally: pass #主动抛出异常 raise TypeError("error!")
72.什么是面向对象的mro
答:方法解析顺序
经典类(calssic class),深度优先遍历当用super调用父类的方法时,会按照__mro__属性中的元素顺序去挨个查找方法。我们可以通过“类名.__mro__”或“类名.mro()”来查看上面代码中D类的__mro__属性值:
73.isinstance作用以及应用场景?
答:来判断一个对象是否是一个已知的类型;
判断object是否与第二个参数的类型相同
74.写代码并实现:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
75.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
答: string、int、list、tuple、dict、bool、null
定制支持datetime类型
76.json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
答:
import json a=json.dumps({"ddf":"你好"},ensure_ascii=False) print(a) #{"ddf": "你好"}
77.什么是断言?应用场景?
答:是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息。例如:
防御型的编程
运行时检查程序逻辑
检查约定
程序常量
检查文档
78.有用过with statement吗?它的好处是什么?
答:语句的作用是通过某种方式简化异常处理,它是所谓的上下文管理器的一种
79.使用代码实现查看列举目录下的所有文件。
80.简述 yield和yield from关键字。
答:yield from generator 。实际上就是返回另外一个生成器
yield 生成器
2.网络编程和并发
1.简述 OSI 七层协议。
答:物理层,数据连接层,网络层,传输层,会话层,表示层,应用层
2.什么是C/S和B/S架构?
答:C/S是客户端和服务器端结构;B/S是浏览器和服务器结构;
3.简述 三次握手、四次挥手的流程。
答:三次握手,①连接开始时,连接建立发送SYN包到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列号编号;②服务器收到SYN包,并确认SYN,同时发送自己的一个SYN包,即SYN+ACK包,此事服务器进入SYN_RECV状态;③客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端与服务器同时进入ESTABLISHED状态,完成三次握手;
四次握手
- 1)A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- 2)B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
- 3)A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- 4)B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
- 5)A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。
4.什么是arp协议?
答:地址解析协议,使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。
5.TCP和UDP的区别?
答:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
6.什么是局域网和广域网?
答:局域网和广域网是按规模大小而划分的两种计算机网络。范围在几千米以内的计算机网络统称为局域网;而连接的范围超过10千米的,则称为广域网,因特网(Intenet)就是目前最大的广域网。
7.为何基于tcp协议的通信比基于udp协议的通信更可靠?
8.什么是socket?简述基于tcp协议的套接字通信流程。
9.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
10.IO多路复用的作用?
11.什么是防火墙以及作用?
12.select、poll、epoll 模型的区别?
13.简述 进程、线程、协程的区别 以及应用场景?
14.GIL锁是什么鬼?
15.Python中如何使用线程池和进程池?
16.threading.local的作用?
17.进程之间如何进行通信?
18.什么是并发和并行?
19.进程锁和线程锁的作用?
20.解释什么是异步非阻塞?
21.路由器和交换机的区别?
22.什么是域名解析?
23.如何修改本地hosts文件?
24.生产者消费者模型应用场景及优势?
25.什么是cdn?
26.LVS是什么及作用?
27.Nginx是什么及作用?
28.keepalived是什么及作用?
29.haproxy是什么以及作用?
30.什么是负载均衡
31.什么是rpc及应用场景?
32.简述 asynio模块的作用和应用场景。
33.简述 gevent模块的作用和应用场景。
34.twisted框架的使用和应用?
3.数据库和缓存
1.列举常见的关系型数据库和非关系型都有那些?
答:关系型,Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
非关系型,NoSql、Cloudant、MongoDb、redis、HBase
2.MySQL常见数据库引擎及比较?
答:
3.简述数据三大范式?
答:①当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
②如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
③设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
4.什么是事务?MySQL如何支持事务?
答:事务是由一步或几步数据库操作序列组成逻辑齿形单元,这系列妖魔全部执行,要么全部放弃执行。具有原子性,一致性,隔离性,持续性。
①begin,rollback,commit来实现;②直接使用set来改变mysql的自动提交模式;
5.简述数据库设计中一对多和多对多的应用场景?
答:一对一,外键关联、主键关联;
多对多,一般采用中间表的方式处理,将多对多表转化为两个一对多;
6.如何基于数据库实现商城商品计数器?
答:
create table product (id primary key auto_increment, pname varchar(64), pcount int);
7.常见SQL(必备)
详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
8.简述触发器、函数、视图、存储过程?
9.MySQL索引种类
普通索引:这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
–直接创建索引 CREATE INDEX index_name ON table(column(length)) –修改表结构的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) –创建表的时候同时创建索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)) ) –删除索引 DROP INDEX index_name ON table
唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似
–创建唯一索引 CREATE UNIQUE INDEX indexName ON table(column(length)) –修改表结构 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) –创建表的时候直接指定 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), UNIQUE indexName (title(length)) );
全文索引:MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
–创建表的适合添加全文索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (content) ); –修改表结构添加全文索引 ALTER TABLE article ADD FULLTEXT index_content(content) –直接创建索引 CREATE FULLTEXT INDEX index_content ON article(content)
组合索引(最左前缀):平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。
–使用到上面的索引 SELECT * FROM article WHREE title='测试' AND time=1234567890; SELECT * FROM article WHREE utitle='测试'; –不使用上面的索引 SELECT * FROM article WHREE time=1234567890;
10.索引在什么情况下遵循最左前缀的规则?
11.主键和外键的区别?
答:主键,唯一标识一条记录,不能有重复的,不允许为空
外键,表的外键是另一表的主键, 外键可以有重复的, 可以是空值
12.MySQL常见的函数?
答:字符串函数,数字函数,日期函数,高级函数
13.列举 创建索引但是无法命中索引的8种情况。
答:①如果条件中有or,即使其中有条件带索引也不会使用;②对于多列索引,不是使用的第一部分(第一个),则不会使用索引;③like查询是以%开头;④如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引;⑤如果mysql估计使用全表扫描要比使用索引快,则不使用索引;
14.如何开启慢日志查询?
答:开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。
#查看慢查询相关参数 show variables like 'slow_query%'; show variables like 'long_query_time'; #设置,临时生效 set global slow_query_log='ON'; set global slow_query_log_file='/var/lib/mysql/test-10-226-slow.log'; set global long_query_time=1; #设置,永久生效 #编辑配置文件/etc/my.cnf加入如下内容 [mysqld] slow_query_log = ON slow_query_log_file = /var/lib/mysql/test-10-226-slow.log long_query_time = 1
15.数据库导入导出命令(结构+数据)?
答:
16.数据库优化方案?
答:
17.char和varchar的区别?
答:char的长度是不可变的;varchar的长度是可变的
18.简述MySQL的执行计划?
答:
19.在对name做了唯一索引前提下,简述以下区别:
select * from tb where name = ‘Oldboy-Wupeiqi’
select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1
答:切片的作用相似,没有步进参数
20.1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?
答:当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢
子查询优化法;倒排表优化法;反向查找优化法;limit限制优化法;只查索引法
21.什么是索引合并?
答:索引合并是把几个索引的范围扫描合并成一个索引;索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引;这些需要合并的索引只能是一个表的。不能对多表进行索引合并。
22.什么是覆盖索引?
答:如果索引的叶子节点包含了要查询的数据,那么就不用回表查询了,也就是说这种索引包含(亦称覆盖)所有需要查询的字段的值,我们称这种索引为覆盖索引。
23.简述数据库读写分离?
答:让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
24.简述数据库分库分表?(水平、垂直)
答:
25.redis和memcached比较?
26.redis中数据库默认是多少个db 及作用?
27.python操作redis的模块?
28.如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?
29.redis如何实现主从复制?以及数据同步机制?
30.redis中的sentinel的作用?
31.如何实现redis集群?
32.redis中默认有多少个哈希槽?
33.简述redis的有哪几种持久化策略及比较?
34.列举redis支持的过期策略。
35.MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?
36.写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。
37.如何基于redis实现消息队列?
38.如何基于redis实现发布和订阅?以及发布订阅和消息队列的区别?
39.什么是codis及作用?
40.什么是twemproxy及作用?
41.写代码实现redis事务操作。
42.redis中的watch的命令的作用?
43.基于redis如何实现商城商品数量计数器?
44.简述redis分布式锁和redlock的实现机制。
45.什么是一致性哈希?Python中是否有相应模块?
46.如何高效的找到redis中所有以oldboy开头的key?
4.前端、框架和其他
1.谈谈你对http协议的认识。
答:因特网上应用最广泛的一种网络协议,基于TCP、IP通讯协议来传输数据;
2.谈谈你对websocket协议的认识。
答:
3.什么是magic string ?
4.如何创建响应式布局?
5.你曾经使用过哪些前端框架?
6.什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。
7.如何在前端实现轮训?
8.如何在前端实现长轮训?
9.vuex的作用?
10.vue中的路由的拦截器的作用?
11.axios的作用?
12.列举vue的常见指令。
简13.述jsonp及实现原理?
14.是什么cors ?
15.列举Http请求中常见的请求方式?
答:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE
16.列举Http请求中的状态码?
答:200-请求成功;301 - 资源被永久转移到其他URL;404 - 请求的资源不存在;500 - 内部服务器错误
17.列举Http请求中常见的请求头?
答:Allow,Date,Location
18.看图写结果:
答:李杰
19.看图写结果:
答:武沛齐
20.看图写结果:
答:老男孩
21.看图写结果:
22.看图写结果:
23.看图写结果:
24.django、flask、tornado框架的比较?
25.什么是wsgi?
答:一种描述web server与web appliaction的通讯的规范
26.django请求的生命周期?
答:wsgi - 中间件 - 路由系统 - 视图函数 - (ORM,Template,渲染)
27.列举django的内置组件?
答:admin,model,form
28.列举django中间件的5个方法?以及django中间件的应用场景?
答:Process Request:请求进来时,权限认证;
process view:路由匹配之后,能够得到的视图;
process exception:异常时执行;
process template responseprocess:模板渲染时执行
process response:请求有响应时执行
29.简述什么是FBV和CBV?
答:FBV,基于函数的视图;CBV,基于类的视图;
30.django的request对象是在什么时候创建的?
答:请求走到WSGIHandler类的时候,执行cell方法,将environ封装成request
31.如何给CBV的程序添加装饰器?
答:
from django.utils.decorators import method_decorator 1、给方法加: @method_decorator(check_login) def post(self, request): ... 2、给dispatch加: @method_decorator(check_login) def dispatch(self, request, *args, **kwargs): ... 3、给类加: @method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...
32.列举django orm 中所有的方法(QuerySet对象的所有方法)
答:all(),filter(**kwargs),get(**kwargs),exclude(**kwargs),order_by(*field),reverse(),count(),first()
33.only和defer的区别?
答:only("id"),取的对象只有id,defer则除了id都有
34.select_related和prefetch_related的区别?
答:
前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能
select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询
prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询
35.filter和exclude的区别?
答:两者取到的值都是QuerySet对象,filter选择满足条件的,exclude:排除满足条件的.
36.列举django orm中三种能写sql语句的方法。
答:
1.使用execute执行自定义的SQL
直接执行SQL语句(类似于pymysql的用法)
# 更高灵活度的方式执行原生SQL语句
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;")
ret = cursor.fetchall()
print(ret)
2.使用extra方法 :queryset.extra(select={"key": "原生的SQL语句"})
3.使用raw方法
1.执行原始sql并返回模型
2.依赖model多用于查询
37.django orm 中如何设置读写分离?
答:
38.F和Q的作用?
答:Q查询——对对象的复杂查询;F查询——专门取对象中某列值的操作;
39.values和values_list的区别?
答:values方法可以获取number字段的字典列表;values_list可以获取number的元组列表
40.如何使用django orm批量创建数据?
答:批量插入数据的时候,首先要创建一个对象的列表,然后调用bulk_create方法,一次将列表中的数据插入到数据库中。
product_list_to_insert = list() for x in range(10): product_list_to_insert.append(Product(name='product name ' + str(x), price=x)) Product.objects.bulk_create(product_list_to_insert)
41.django的Form和ModeForm的作用?
答:form,①生成页面可用的HTML标签;②对用户提交的数据进行校验;③保留上次输入的内容;
ModelForm,Django 提供一个辅助类来让我们可以从Django 的模型创建Form
42.django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
答:
def__init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name") authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())//多选
43.django的Model中的ForeignKey字段中的on_delete参数有什么作用?
答:
- 删除关联表中的数据时,当前表与其关联的field的操作
44.django中csrf的实现机制?
答:
- 第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;
- 第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}
- 第三步:后端校验前端请求带过来的token和SESSION里的token是否一致。
45.django如何实现websocket?
答:
django实现websocket官方推荐大家使用channels。channels通过升级http协议 升级到websocket协议。保证实时通讯。也就是说,我们完全可以用channels实现我们的即时通讯。而不是使用长轮询和计时器方式来保证伪实时通讯。他通过改造django框架,使django既支持http协议又支持websocket协议。
46.基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
答:
后端将csrftoken传到前端,发送post请求时携带这个值发送
data: { csrfmiddlewaretoken: '{{ csrf_token }}' },
获取form中隐藏标签的csrftoken值,加入到请求数据中传给后端
data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() },
cookie中存在csrftoken,将csrftoken值放到请求头中
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}
47.django中如何实现orm表中添加数据时创建一条日志记录。
48.django缓存如何设置?
答:
# 全站缓存 MIDDLEWARE_CLASSES = ( ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 'django.middleware.common.CommonMiddleware', ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后 ) # 视图缓存 from django.views.decorators.cache import cache_page import time @cache_page(15) #超时时间为15秒 def index(request): t=time.time() #获取当前时间 return render(request,"index.html",locals()) # 模板缓存 {% load cache %} <h3 style="color: green">不缓存:-----{{ t }}</h3> {% cache 2 'name' %} # 存的key <h3>缓存:-----:{{ t }}</h3> {% endcache %}
49.django的缓存能使用redis吗?如果可以的话,如何配置?
答:
#1.安装 pip install django-redis #2.在stting中配置CACHES,可以设置多个缓存,根据名字使用 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }, #另添加缓存 "JERD": { } #3.根据名字去连接池中获取连接 from django_redis import get_redis_connection conn = get_redis_connection("default")
50.django路由系统中name的作用?
答:
51.django的模板中filter和simple_tag的区别?
答:
# 自定义filter:{{ 参数1|filter函数名:参数2 }} # 1.可以与if标签来连用 # 2.自定义时需要写两个形参 # simple_tag:{% simple_tag函数名 参数1 参数2 %} # 1.可以传多个参数,没有限制 # 2.不能与if标签来连用
filter,可以与if标签来连用,自定义是需要写两个形参;simple_tags,可以传多个参数没有限制,不能与if连用;
52.django-debug-toolbar的作用?
答:1.是django的第三方工具包,给django扩展了调试功能
#包括查看sql语句,db查询次数,request,headers等
53.django中如何实现单元测试?
答:
54.解释orm中 db first 和 code first的含义?
#数据持久化的方式: #db first基于已存在的数据库,生成模型 #code first基于已存在的模型,生成数据库库
55.django中如何根据数据库表生成model中的类?
答:
#1.在settings中设置要连接的数据库 #2.生成model模型文件 #python manage.py inspectdb #3.模型文件导入到models中 # python manage.py inspectdb > app/models.py
56.使用orm和原生sql的优缺点?
答:
#1.orm的开发速度快,操作简单。使开发更加对象化 #执行速度慢。处理多表联查等复杂操作时,ORM的语法会变得复杂 #2.sql开发速度慢,执行速度快。性能强
57.简述MVC和MTV
答:
58.django的contenttype组件的作用?
答:
#这个组件保存了项目中所有app和model的对应关系,每当我们创建了新的model并执行数据库迁移后,ContentType表中就会自动新增一条记录 #当一张表和多个表FK关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes
59.谈谈你对restfull 规范的认识?
60.接口的幂等性是什么意思?
61.什么是RPC?
62.Http和Https的区别?
63.为什么要使用django rest framework框架?
64.django rest framework框架中都有那些组件?
答:
#1.序列化组件:serializers 对queryset序列化以及对请求数据格式校验 #2.路由组件routers 进行路由分发 #3.视图组件ModelViewSet 帮助开发者提供了一些类,并在类中提供了多个方法 #4.认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻 #5.权限组件 写一个类并注册到权限类(permission_classes),在类的的has_permission方法中编写认证逻辑。 #6.频率限制 写一个类并注册到频率类(throttle_classes),在类的的allow_request/wait 方法中编写认证逻辑 #7.解析器 选择对数据解析的类,在解析器类中注册(parser_classes) #8.渲染器 定义数据如何渲染到到页面上,在渲染器类中注册(renderer_classes) #9.分页 对获取到的数据进行分页处理, pagination_class #10.版本 版本控制用来在不同的客户端使用不同的行为 #在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同 做不同处理
65.django rest framework框架中的视图都可以继承哪些类?
答:
#class View(object): #class APIView(View): 封装了view,并且重新封装了request,初始化了各种组件 #class GenericAPIView(views.APIView): #1.增加了一些属性和方法,如get_queryset,get_serializer #class GenericViewSet(ViewSetMixin, generics.GenericAPIView) #父类ViewSetMixin 重写了as_view,返回return csrf_exempt(view) #并重新设置请求方式与执行函数的关系 #class ModelViewSet(mixins.CreateModelMixin, # mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # mixins.ListModelMixin, # GenericViewSet):pass #继承了mixins下的一些类,封装了list,create,update等方法 #和GenericViewSet
66.简述 django rest framework框架的认证流程。
答:
#1.用户请求走进来后,走APIView,初始化了默认的认证方法 #2.走到APIView的dispatch方法,initial方法调用了request.user #3.如果我们配置了认证类,走我们自己认证类中的authentication方法
67.django rest framework如何实现的用户访问频率控制?
答:
#使用IP/用户账号作为键,每次的访问时间戳作为值,构造一个字典形式的数据,存起来,每次访问时对时间戳列表的元素进行判断, #把超时的删掉,再计算列表剩余的元素数就能做到频率限制了 #匿名用户:使用IP控制,但是无法完全控制,因为用户可以换代理IP登录用户:使用账号控制,但是如果有很多账号,也无法限制