python部分 + 数据库 + 网络编程

PS:附上个人博客地址,答案中略的部分个人博客都有,直接原标题搜索便可。
https://www.cnblogs.com/Roc-Atlantis/

第一部分 Python基础篇(80题)

为何学习Python?
Omit
经过什么途径学习的Python?
Omit
Python和Java、PHP、C、C#、C++等其余语言的对比?
Omit

简述解释型和编译型编程语言?
编译型语言:在运行程序以前将源代码翻译成目标代码(机器语言),
运行时不须要从新翻译,直接使用翻译的结果,程序执行效率高,依赖编译器运行(好比vs),
跨平台性差。好比c,c++等。

解释型语言:源代码一边翻译成机器语言一遍执行,效率较低,
可是灵活性较高,依赖解释器运行(好比py),修改方便,跨平台性好。如python,java,PHP等。

Python解释器种类以及特色?
cpython pypy jpython
位和字节的关系?
一个字节占8个bit位
b、B、KB、MB、GB 的关系?
1024关系 自行梳理
请至少列举5个 PEP8 规范(越多越好)。
个人博客直接搜索PEP8规范
经过代码实现以下转换:
# 二进制转换成十进制:v = “0b1111011”

# int("1111011",2) # 123
# 十进制转换成二进制:v = 18

# print(bin(18))
# 八进制转换成十进制:v = “011”

# int("011",8) # 9

# 十进制转换成八进制:v = 30

# print(oct(30))
# 十六进制转换成十进制:v = “0x12”

# int("12",16) # 18
# 十进制转换成十六进制:v = 87
# print(hex(87))

请编写一个函数实现将IP地址转换成一个整数。

如 10.3.9.12 转换规则为:
10 00001010

 3 00000011

9 00001001

 12 00001100

再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
def ip_to_int(s):

L = '0b'+''.join([bin(int(i)) for i in s.split('.')]).replace('0b','')
print(int(L,2))

if __name__ == '__main__':
s = "10.3.9.12"
ip_to_int(s)

python递归的最大层数?
import sys
print(sys.getrecursionlimit())
默认最大是1000层
求结果:
v1 = 1 or 3

v2 = 1 and 3

v3 = 0 and 2 and 1

 v4 = 0 and 2 or 1

 v5 = 0 and 2 or 1 or 4

 v6 = 0 or Flase and 1
# 1
# 3
# 0
# 1
# 1
# False
ascii、unicode、utf-八、gbk 区别?
ascii:不能表示中文,英文用一个字节表示
unicode:中文和英文都用2个字节表示
utf-8:英文用一个本身表示,中文用3个
gbk:英文用1个字节表示,中文用2个字节表示

字节码和机器码的区别?
机器码是电脑CPU直接读取运行的机器指令,运行速度最快,
可是很是晦涩难懂,也比较难编写,通常从业人员接触不到。
字节码是一种中间状态(中间码)的二进制代码(文件)。须要直译器转译后才能成为机器码。

三元运算规则以及应用场景?
应用场景:简单的if else语句
a = 3 if x>10 else 12 若是if条件成立就输出前面的结果,若是不成立就输出后面的结果

列举 Python2和Python3的区别?
python2默认ascii,python3默认utf-8
博客搜索python2和python3的区别

用一行代码实现数值交换:

 a = 1

 b = 2
a = 1
b = 2
# a,b = 2,1
# print(a,b)

# c = a
# a = b
# b = c
# print(a,b)

# a,b = (2,1)
# print(a,b)

Python3和Python2中 int 和 long的区别?
python2中须要本身根据数值大小去判断该用int仍是long
python3中取消了long类型数据,会自动判断

xrange和range的区别?
xrange(1,5)是python2里的生成器,可做为list对象获得一个列表
在python3,xrange至关于改了个名字,改为了range,也是一个生成器对象。

文件操做时:xreadlines和readlines的区别?
readlines() 读取文件全部内容,按行为单位放到一个列表中,返回list类型。
xreadlines()官方解释 >> Returns a generator to loop over every single line in the file
xreadlines只在python2里有
返回一个生成器,来循环操做文件的每一行。循环使用时和readlines基本同样,可是直接打印就不一样


列举布尔值为False的常见值?
0,None,"",False

字符串、列表、元组、字典、集合每一个经常使用的5个方法?
字符串:title(),join(),replace(),strip(),split(),eval()
元组:count(),index(),sorted(tuple)
列表:insert(),extend(),append(),pop(),remove(),sort()
字典:get(),items(),values(),keys(),clear(),copy(),pop(),setdefault()
集合:add(),deference(),discard(),remove(),pop(),symmetric_difference(),union(),intersection_update

lambda表达式格式以及应用场景?
lambda 变量名:变量表达式
一般和高阶函数连用 map reduce等

pass的做用?
空函数经常使用
表示直接跳过继续向下运行

*args和**kwargs做用
*args 表示接受溢出的位置参数,并以元组的形式返回给args
**kwargs 表示接受溢出的关键字参数,并以字典的形式返回给kwargs

is和==的区别
is判断id是否相等
== 判断值是否相等
为何有时候值相同可是不一样的两个地址,is判断却为True?
由于python有个缓存机制,必定范围内的整数不会独自再分配一个内存空间,他们共享一个内存空间.

简述Python的深浅拷贝以及应用场景?
深拷贝:拷贝后的对象的值不会再随着被拷贝对象值的改变而改变
浅拷贝:拷贝后的对象得值会随着被拷贝对象值的改变而改变.
浅拷贝的对象若是有多层可变类型,浅拷贝只拷贝第一层,深拷贝是递归拷贝,拷贝到迭代结束.

Python垃圾回收机制?
python每次定义一个变量都会带一个引用计数,每调用一次变量值,引用计数都会加1.
每次引用被删除,引用计数减1.当引用计数为0,变量值就会被当成垃圾回收.

Python的可变类型和不可变类型?
可变类型:列表,集合,字典
不可变类型:元组,字符串,整型

求结果:

 v = dict.fromkeys(['k1','k2'],[])
 #value的内存空间是公用的,全部的键都指向同一个value [].
v[‘k1’].append(666)

 print(v)

v[‘k1’] = 777

 print(v)
求结果:
{'k1': [666], 'k2': [666]}
{'k1': 777, 'k2': [666]}

列举常见的内置函数?
map() reduce() abs() filter() len()

filter、map、reduce的做用?
filter:符合条件的元素会筛选留下来
map:做用于每个可迭代对象的元素
reduce:python3里使用reduce须要调用functools
from functools import reduce
# res = reduce(lambda x,y: (x+y)*2, [1,2,3,4,5])
# print(res)
# ((((((1+2)*2) + 3)*2+4)*2)+5)*2 = 98

一行代码实现9*9乘法表
"\n".join("\t".join(["%s*%s=%s" % (y, x, x*y) for y in range(1, x + 1)]) for x in range(1, 10))

如何安装第三方模块?以及用过哪些第三方模块?
一般用两种方法安装第三方模块:
一:直接用pip安装
二:在第三方库下载安装包,在cmd命令直接安装下载好的包
经常使用的第三方模块:
requests,turtle,pymysql,gevent,mulitprocessing,threading,bs4
至少列举8个经常使用模块都有那些?
random,time,turtle,requests,math,re,os,pickle,json,logging,sys,subprocess,pymysql,hashlib

re的match和search区别?
re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。

什么是正则的贪婪匹配?
.*从.前面的字符开始匹配,一直到*后面字符是整个字符串最后一个符合条件的才会结束。
补充下非贪婪匹配:.*? 匹配到最近的一个符合条件的字符就会停下来。

求结果:
 a. [ i % 2 for i in range(10) ]
 b. ( i % 2 for i in range(10) )
a [0,1,0,1,0,1,0,1,0,1]
b 生成器表达式

求结果:
 a. 1 or 2
 b. 1 and 2
 c. 1 < (2==2)
 d. 1 < 2 == 2
a 1
b 2
c False
d True

def func(a,b=[]) 这种写法有什么坑?
会形成重复赋值,形参名不要写成变量的形式。

如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
a = "1,2,3"
print(a.split(","))

如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
a = ["1","2","3"]
for i in range(len(a)):
a[i] = int(a[i])

print(a)

比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
b = [(1),(2),(3) ] 和a = [1,2,3]没区别,最多写的形式不同
b = [(1,),(2,),(3,)] 这个由于多了个小括号里的逗号,列表里至关于嵌套了元组,
打印出来结果和前面两个是不同的

如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
[i**2 for i in range(1,11)]

一行代码实现删除列表中重复的值 ?
字典key值的惟一性
print(dict.fromkeys(l).keys())
集合去重
print(set([1,2,3,4,1,2])

如何在函数中设置一个全局变量 ?
加入globals 申明下面的变量为全局变量

logging模块的做用?以及应用场景?(待补充--一般会忘记补充)
日志模块。
应用场景:须要生成日志在屏幕或者须要日志记录。

请用代码简答实现stack 。(实现堆栈--先进先出和先进后出)
一.用到append(i)和insert(0,i) ==for循环出结果
二.线程queue中的q = queue.Queue()-先进先出和q = queue.LifoQueue() --先进后出

经常使用字符串格式化哪几种?
"%s"%i
"{}-{}".format(1,2)
f"" python3新增,不太了解

简述 生成器、迭代器、可迭代对象 以及应用场景?
可迭代对象:有__iter__方法的都是可迭代对象
迭代器:自己就是由可迭代对象通过__iter__方法转换成迭代器对象,自己有__iter__和__next__方法。
生成器:生成器自己就是个迭代器,生成器构造有个yield函数,至关于自定义迭代器。

用Python实现一个二分查找的函数。
num = [1,3,4,5,6,8,22,33,55,778,990]
def search(search_number,num):
if len(num) == 0:return
mid = len(num) // 2
mid_nums = num[len(num)//2]
if search_number > mid_nums:
num = num[mid + 1:]
search(search_number,num)
elif search_number < mid_nums:
num = num[:mid]
search(search_number, num)
else:
print("find it")

search(363,num)

谈谈你对闭包的理解?
闭包就是调用函数会获得一个返回值,返回值是函数的内存地址。加括号便可调用。
闭指的是该函数是一个内部函数
包指的是该函数对外部做用域(非全局做用域)名字的引用。

os和sys模块的做用?
os:这个模块提供了一种方便的使用操做系统函数的方法。
sys:这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数。

总结:os模块负责程序与操做系统的交互,提供了访问操做系统底层的接口;sys模块负责程序
与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

如何生成一个随机数?
调用random模块
random.randint(1,3)
random.randrange(1,3)
random.random()

如何使用python删除一个文件?
import os
os.remove(文件路径)

谈谈你对面向对象的理解?
核心是对象。对象是特征与技能的结合体,类就是一系列对象类似的特征与技能的结合体。
面向对象编程

Python面向对象中的继承有什么特色?
继承:子类会遗传父类的属性 继承是类与类之间的关系
继承的特色:
一、在继承中基类的构造(__init__()方法)不会被自动调用,
它须要在其派生类的构造中亲自专门调用。有别于C#
二、在调用基类的方法时,须要加上基类的类名前缀,且须要带上self参数变量。
区别于在类中调用普通函数时并不须要带上self参数
三、Python老是首先查找对应类型的方法,若是它不能在派生类中找到对应的方法,
它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)

面向对象深度优先和广度优先是什么?
本身理解:深度优先就是在查找方式上遍历到最后的节点,和递归相似,有明确的结束条件。
广度优先就是不优先查找最后的节点,到最后才去查找。
新式类:广度查找优先,经典类:深度查找优先
网上:
深度优先:
将一个子节点的全部内容所有遍历完毕以后再去遍历其余节点实现的 (递归实现)
广度优先:
广度优先的算法的实现是经过 分层次的进行遍历 先遍历第一层,而后第二层,第三层 (队列实现)
深度优先遍历的算法是经过递归的方式一只只遍历某一个节点从而进行的,
而广度优先遍历算法则是把上一个层次的全部节点纳入队列所有遍历完毕再进行下面的遍历的
面向对象中super的做用?(具体参考博客)
要理解super的原理,就要先了解mro。mro是method resolution order的缩写,表示了类继承体系中的成员
解析顺序。在python中,每一个类都有一个mro的类方法。
能够看到mro方法返回的是一个祖先类的列表。Leaf的每一个祖先都在其中出现一次,
这也是super在父类中查找成员的顺序。
经过mro,python巧妙地将多继承的图结构,转变为list的顺序结构。super在继承体系中向上的查找过程,
变成了在mro中向右的线性查找过程,任何类都只会被处理一次。
经过这个方法,python解决了多继承中的2大难题:
1. 查找顺序问题。从Leaf的mro顺序能够看出,若是Leaf类经过super来访问父类成员,
那么Medium1的成员会在Medium2以前被首先访问到。
若是Medium1和Medium2都没有找到,最后再到Base中查找。
2. 钻石继承的屡次初始化问题。在mro的list中,Base类只出现了一次。事实上任何类都只会在mro list中
出现一次。这就确保了super向上调用的过程当中,任何祖先类的方法都只会被执行一次。

是否使用过functools中的函数?其做用是什么?
搜索我博客:functools模块中的函数


列举面向对象中带双下划线的特殊方法,如:__new__、__init__
__new__
__init__
__str__
__call__
__del__
__iter__
__next__
下面是查看对象属性的一些方法
__name__
__main__
__doc__
__file__
__metaclass__
__dict__


如何判断是函数仍是方法?
函数:

  函数是封装了一些独立的功能,能够直接调用,
python内置了许多函数,同时能够自建函数来使用。
方法:
  方法和函数相似,一样封装了独立的功能,可是方法是
须要经过对象来调用的,表示针对这个对象要作的操做,使用时采用点方法。

静态方法和类方法区别?
静态方法是类和对象均可以调用,调用的时候必须传入对应的参数
类方法:类调用直接把调用的类看成参数传入,对象调用类方法仍是会自动传入类。

列举面向对象中的特殊成员以及应用场景
__new__
__init__
__str__
__call__
__del__
__iter__
__next__
__getitem__ 、 __setitem__ 、__delitem__ 用于索引操做,如字典。分别表示获取、设置、删除数据


一、二、三、四、5 能组成多少个互不相同且无重复的三位数
count = 0
for i in range(1,6):
for m in range(1,6):
for n in range(1,6):
if i != m and m != n and i!=n:
print(100*i + 10*m + n)
count+=1

print(count)

什么是反射?以及应用场景?
反射就是经过字符串来操做类和对象的属性
hasattr(obj,attrib) 判断对象是否存在这个属性,存在就返回True
getattr(obj,attrib,None) 判断属性对象是否能够访问,若是能够
就返回数据属性的值或者函数属性的内存地址。若是不能,就返会None。
setattr(obj,attrib,属性值) 修改对象的属性值,若是没有该属性则添加属性到名称空间
delattr(obj,attrib) 删除对象名称空间里的属性值,删除类的属性值,数据属性和函数属性均可以删除


metaclass(元类)做用?以及应用场景?
元类负责控制类的产生过程。
分为type元类建立类和自定义元类建立类。具体看我博客。

用尽可能多的方法实现单例模式。
三种:一:直接在类中经过if判断来肯定__instance是否为None,若是是给他赋值,不是直接返回self.__instance
二.经过在类上加装饰器的方法实现。装饰器里的wrapper就是Mysql,调用wrapper至关于经过Mysql往里面传值
,若是不传值args和kwargs长度为0,能够以此为关键进行判断。
三.自定义元类中经过传入参数的长度来判断是否传参,没传参直接返回self.__instance,传参则产生新对象

装饰器的写法以及应用场景。
单层装饰器和多层装饰器
为了节省代码量,避免代码冗余,装饰器出现解决了这些问题。
无参装饰器外面包着一层,有参装饰器外面包着两层。一般写成语法糖的形式,放在被装饰的对象上面。
装饰器是为了避免违背开放封闭原则的前提下,为被装饰对象添加功能。

异常处理写法以及如何主动抛出异常(应用场景)
异常处理:try..except..else..finally
主动抛出:raise Typeerror("抛出的异常说明")


什么是面向对象的mro
mro是子类查找父类的顺序,mro列表里的类不会重复而且只会被查找一次,且按照继承的顺序来。

isinstance做用以及应用场景?
isinstance(obj,class) 判断对象obj是否是由class生成的对象。

什么是语句,什么是表达式?

写代码并实现:
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]
l = [2,7,11,15]
target = 9
for i in l:
for m in l:
if i != m and i+m == target:
print(i,m)
json序列化时,能够处理的数据类型有哪些?如何定制支持datetime类型?
json不能够处理的数据类型:元组,集合,自定义类和类的对象。
datetime类型???


json序列化时,默认遇到中文会转换成unicode,若是想要保留中文怎么办?
Str=json.dumps(jsonData,ensure_ascii=False,indent=2)
加上ensure_ascii=False便可。 indent是用来设置排版格式。

什么是断言?应用场景?
详情见我博客,本身解释不清,也不懂assert到底怎么用。

有用过with statement(with 声明)吗?它的好处是什么?
>>>with open('text.txt')as my_file:
...whileTrue:
...line=my_file.readline()
...if not line:
...break
...print(line)
#with语句使用所谓的上下文管理器对代码块进行包装,容许上下文管理器实现一些设置和清理操做。
#例如:文件能够做为上下文管理器使用,它们能够关闭自身做为清理的一部分。
#NOTE:在PYTHON2.5中,须要使用from__future__importwith_statement进行with语句的导入

使用代码实现查看列举目录下的全部文件。
import os
for file in os.listdir(r'\address'):
print(file)

简述 yield和yield from关键字。
看我博客 看我博客 。

第二部分 网络编程和并发(34题)

简述 OSI 七层协议。
物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
数据链路层: 功能:定义了电信号分组的方式 以太网协议
网络层:网络层功能:引入一套新的地址用来区分不一样的广播域/子网,这套地址即网络地址
规定网络地址的协议叫作ip协议,它定义的地址称为ip地址
传输层:传输层功能:创建端口到端口的通讯
应用层:必须有不一样协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。

什么是C/S和B/S架构?
客户端与服务端通讯
浏览器客户端与服务端通讯
先从服务器端提及。服务器端先初始化Socket,而后与端口绑定(bind),对端口进行监听(listen),
调用accept阻塞,等待客户端链接。在这时若是有个客户端初始化一个Socket,而后链接服务器(connect),
若是链接成功,这时客户端与服务器端的链接就创建了。客户端发送数据请求,服务器
端接收请求并处理请求,而后把回应数据发送给客户端,客户端读取数据,最后关闭链接,一次交互结束。

简述 三次握手、四次挥手的流程。
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算链接的服务器的端口,
以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,
将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.而且把服务器
发来ACK的序号字段+1,放在肯定字段中发送给对方.而且在数据段放写ISN的+1

链接终止协议(四次分手)
  因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这原则是当一方完成它的数据
发送任务后就能发送一个FIN来终止这个方向的链接。收到一个 FIN只意味着这一方向上没有数据流动,
一个TCP链接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。
  (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
  (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。
和SYN同样,一个FIN将占用一个序号。
  (3) 服务器关闭客户端的链接,发送一个FIN给客户端(报文段6)。
  (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
什么是arp协议?
ARP协议
ARP 地址解析协议,就是 把 IP->MAC(你听过ARP欺骗的)
arp协议由来:计算机通讯基本靠吼,即广播的方式,全部上层的包到最后都要封装上以太网头,
而后经过以太网协议发送,在谈及以太网协议时候,我门了解到
通讯是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,
就须要经过arp协议。
一:首先经过ip地址和子网掩码区分出本身所处的子网
二:分析172.16.10.10/24与172.16.10.11/24处于同一网络
(若是不是同一网络,那么下表中目标ip为172.16.10.1,经过arp获取的是网关的mac)
三:这个包会以广播的方式在发送端所处的自网内传输,全部主机接收后拆开包,
发现目标ip为本身的,就响应,返回本身的mac
最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。
前者就是本机网卡的MAC地址,后者这时不知道,
就填入一个广播地址:FF-FF-FF-FF-FF-FF
arp协议功能:广播的方式发送数据包,获取目标主机的mac地址。

TCP和UDP的区别?
TCP协议每一次传输都要发送请求和确认传输信号,安全可靠,速度较慢。
UDP协议直接传输,不须要通过请求,速度会很快,但容易形成数据包的丢失。

什么是局域网和广域网?
广域网:做用范围大,通常能够从几十千米至几万千米。
一个国家或国际间创建的网络都是广域网。在广域网内,用于通讯的传输装置和传输介质可由电信部门提供。
局域网(LAN):为了完整地给出LAN的定义,必须使用两种方式:一种是功能性定义,另外一种是技术性定义。
前一种将LAN定义为一组台式计算机和其它设备,在物理地址上彼此相隔不远,以容许用户相互通讯
和共享诸如打印机和存储设备之类的计算资源的方式互连在一块儿的系统。这种定义适用于办公环境下
的LAN、工厂和研究机构中使用的LAN。
就LAN的技术性定义而言,它定义为由特定类型的传输媒体(如电缆、光缆和无线媒体)和网络适配器
(亦称为网卡)互连在一块儿的计算机,并受网络操做系统监控的网络系统。

为什么基于tcp协议的通讯比基于udp协议的通讯更可靠?
tcp协议设立了接受确认和重传机制。每一次信息传输都和三次握手同样,使得每个信息都能保证到达,很可靠。
udp是尽力传送,没有确认和重传机制,udp只是将信息发送出去,对方收不收到也不进行应答

什么是socket?简述基于tcp协议的套接字通讯流程。
socket是套接字。
先从服务器端提及。服务器端先初始化Socket,而后与端口绑定(bind),对端口进行监听(listen),
调用accept阻塞,等待客户端链接。在这时若是有个客户端初始化一个Socket,而后链接服务器(connect),
若是链接成功,这时客户端与服务器端的链接就创建了。客户端发送数据请求,服务器端接收请求并处理请求,
而后把回应数据发送给客户端,客户端读取数据,最后关闭链接,一次交互结束。

什么是粘包?socket中形成粘包的缘由是什么? 哪些状况会发生粘包现象?
产生粘包的缘由:第一点:客户端向服务端发起命令请求,服务端接受命令请求,并返回对应的信息,
若是信息过大,客户端一次接受不了,那么下一次请求依然返回
上一个命令的内容,就出现了粘包的状况。
第二点:发送端须要等缓冲区满才发送出去,形成粘包(发送数据时间间隔很短,数据了很小,
会合到一块儿,产生粘包)
所谓粘包问题主要仍是由于接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所形成的。
发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将屡次间隔较小且数据量
小的数据,合并成一个大的数据块,而后进行封包。这样作,虽然节省了时间,可是发出的包却粘在了一块儿,
形成粘包现象。


IO多路复用的做用?
IO复用机制能够同时监控多个描述符,当某个描述符就绪(读或写就绪),则当即通知相应程序进行读或写操做。
但select,poll,epoll本质上都是同步I/O,由于他们都须要在读写事件就绪后本身负责进行读写,也就是说
这个读写过程是阻塞的。
I/O多路复用的优点并非对于单个链接能处理的更快,而是在于能够在单个线程/进程中处理更多的链接。
与多进程和多线程技术相比,I/O多路复用技术的最大优点是系统开销小,系统没必要建立进程/线程,
也没必要维护这些进程/线程,从而大大减少了系统的开销。

什么是防火墙以及做用?
防火墙见我博客

select、poll、epoll 模型的区别?
见个人博客

简述 进程、线程、协程的区别 以及应用场景?
看个人博客

GIL锁是什么鬼?
全局解释器锁
当程序在运行某段代码遇到GIL锁,此时会变成串行,须要一个线程执行完该段代码下一个执行才能够进去。

Python中如何使用线程池和进程池?
# 进程池
from concurrent.futures import ProcessPoolExecutor
import time,os
def func1(name):
print("%s is %s"%(name,os.getpid())) # 打印了进程id
time.sleep(1)

if __name__ == "__main__":
p = ProcessPoolExecutor(4) # 指定进程池最大进程个数
for i in range(10):
obj = p.submit("omit %s"%i,i) 提交任务

# 线程池
rom concurrent.futures import ThreadPoolExecutor
import time,os,random
def func2(name):
print("%s is %s"%(name,os.getpid())) # 打印了进程id
time.sleep(random.randint(1,3))

if __name__ == "__main__":
p = ThreadPoolExecutor(4) # 指定线程池最大线程个数,不包含控制线程
for i in range(10):
obj = p.submit("omit %s"%i,i) # 提交任务

threading.local的做用?
一旦在主线程实例化了一个local,它会一直活在主线程中,而且又主线程启动的子线程调用这个local实例时,
它的值将会保存在相应的子线程中。
1.local_data具备全局访问权,主线程,子线程都能访问它。
2.可是 local_data的值倒是线程隔离的,值只与各当前线程有关。
ThreadLocal 最经常使用的地方:
为每一个线程绑定一个资源(数据库链接,HTTP请求,用户身份信息等),
这样一个线程的全部调用到的处理函数均可以很是方便地访问这些资源。

进程之间如何进行通讯?
经过管道或者队列来通讯。通常用的队列,由于队列是管道加锁,不用本身再加锁。
导入multiprocessing模块中的Queue,生成Queue对象,调用put方法把值放到队列里,get从队列里取值,
每取一个值也同时删除队列中的该值。

什么是并发和并行?
并发是伪并行,经过遇到IO切换来实现相似并行的效果。
并行多核才能实现,多个进程同时工做。

进程锁和线程锁的做用?
线程锁:你们都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么
在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,
同一时间只有一个线程在执行,其他线程必需要等待当前线程执行完以后才能执行该代码段。可是,
其他线程是能够访问该对象中的非加锁代码块的。

进程锁:也是为了控制同一操做系统中多个进程访问一个共享资源,只是由于程序的独立性,
各个进程是没法控制其余进程对资源的访问的,可是可使用本地系统的信号量控制(操做系统基本知识)。

解释什么是异步非阻塞?
见我博客

路由器和交换机的区别?
1、工做所在的OSI层次不同(根本区别,致使接下来的区别)
交换机工做在 OSI模型的数据链路层,因此工做原理比较简单;
路由器工做在OSI模型的网络层,具有更多的网络协议信息,因此能够作出更好的数据转发策略。

2、数据转发所依据的对象也不同。
交换机工做在数据链路层,因此交换机转发数据依靠的是每一个物理地址(MAC地址),MAC地址通常
是设备生产商在设备出厂时固定在设备中的,不能进行更改。
路由器工做在网络层,因此其交换数据依靠网络地址(IP地址),而IP地址是由网络管理员本身分配
或者系统自动获取的。
3、是否能够分割广播域
由交换机链接的全部端口仍然属于同一个广播域,因此极有可能会产生数据拥堵;
链接到路由器上的全部端口不在属于同一个广播域,因此不会产生相似的数据拥堵问题

什么是域名解析?
域名解析是把域名指向网站空间IP,让人们经过注册的域名能够方便地访问到网站一种服务。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,
服务由DNS服务器完成,是把域名解析到一个IP地址,而后在此IP地址的主机上将一个子目录与域名绑定。
若是是须要建站,除了注册域名,还须要向虚拟主机提供商申请空间,若是空间是国内的还须要备份,
国外的空间则不须要。

如何修改本地hosts文件?
1.在菜单栏找到记事本
2.右键记事本 >>使用管理员权限打开
3.单击文件按钮>>下拉菜单点击打开文件>>C:\Windows\System32\drivers\etc 这个路径
4.若是到这步来了找不到hosts文件这是咱们点击文本文档下拉框选择 “全部文件”
5.输入127.0.0.1 或你指向的IP就好了,ctrl + s 就OK
hosts记录规则很是简单,只须要将你的记录以 “IP + 空格 + 域名” 的格式填写便可。

生产者消费者模型应用场景及优点?
生产者与消费者模式是经过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通信,
而是利用阻塞队列来进行通信,生产者生成数据后直接丢给阻塞队列,消费者须要数据则从阻塞队列获取,实际应
用中,生产者与消费者模式则主要解决生产者与消费者生产与消费的速率不一致的问题,达到平衡生产者与消费者
的处理能力,而阻塞队列则至关于缓冲区。
# 应用场景
由一个线程生成订单,并将其放入队列中.由多个线程去处理
# 优点
平衡生产者与消费者的处理能力

简述 gevent模块的做用和应用场景。
Gevent 是一个第三方库,能够轻松经过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet,
它是以C扩展模块形式接入Python的轻量级协程。 Greenlet所有运行在主程序操做系统进程的内部,但它们被
协做式地调度。

什么是cdn?
CDN的全称是Content Delivery Network,即内容分发网络。
其基本思路是尽量避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
经过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统可以实时地根
据网络流量和各节点的链接、负载情况以及到用户的距离和响应时间等综合信息将用户的请求从新导向离用户最近
的服务节点上。
其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的情况,提升用户访问网站的响应速度。


第三部分 数据库和缓存(46题)

列举常见的关系型数据库和非关系型都有那些?
关系型 : MySQL,SQL Server ,Oracle , Sybase, DB2
非关系型 : Redis, MongodDB

MySQL常见数据库引擎及比较?
ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数
要远大于更新的次数。所以,ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个
主要不足之处在于,它不支持事务处理,也不可以容错:若是你的硬盘崩溃了,那么数据文件就没法恢复了。
若是你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实时数据,经过其复制特性,
MYSQL可以支持这样的备份应用程序。

MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引
和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做,
其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展
,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操做
,这可能就是为何MySQL受到了WEB开发如此青睐的主要缘由:在WEB开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和INTERNET平台提供商只容许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。

InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL
的时候,你所面对的每个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)
也不支持外来键。尽管要比ISAM和 MyISAM引擎慢不少,可是InnoDB包括了对事务处理和外来键的支持,这两点
都是前两个引擎所没有的。如前所述,若是你的设计须要这些特性中的一者或者二者,那你就要被迫使用后两个
引擎中的一个了。

MEMORY: MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来建立表,并且数据所有放在内存中。
这些特性与前面的两个很不一样。每一个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,
类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,
提升整个表的效率。值得注意的是,服务器须要有足够的内存来维持MEMORY存储引擎的表的使用。若是不须要了,
能够释放内存,甚至删除不须要的表。MEMORY默认使用哈希索引。速度比使用B型树索引快。固然若是你想用B型树
索引,能够在建立索引时指定。注意,MEMORY用到的不多,由于它是把数据存到内存中,若是内存出现异常就会
影响数据。若是重启或者关机,全部数据都会消失。所以,基于MEMORY的表的生命周期很短,通常是一次性的。

简述数据三大范式?
1.第一范式:确保每列保持原子性
2.第二范式:确保表中的每列都和主键相关
3.第三范式:确保表中每一列都和主键列直接相关,而不是间接相关.

什么是事务?MySQL如何支持事务?
事务是逻辑上的一组操做,组成这组操做的各个单元,要不全都成功要不全都失败,这个特性就是事务
事务能够包含一系列的sql语句,事务的执行具备原子性
一、原子性:
包含多条sql语句要么都执行成功,要么都执行不成功
二、回滚

简述数据库设计中一对多和多对多的应用场景?
应用场景:一对多:一个学生能够有多门课程
多对多:一个老师能够有多个学生,一个学生也能够有多个老师

如何基于数据库实现商城商品计数器?
详情见我博客

常见SQL(必备)
详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html

简述触发器、函数、视图、存储过程?
触发器: 在执行某种操做先后一些自定义的操做
函数: 处理参数,返回结果
视图: 把须要的数据存放在一张临时表中,简化查询
存储过程: sql语句集,简化了一些操做.与函数不一样,他能够返回一个结果集(查询结果)

MySQL索引种类
1. 普通索引
这是最基本的索引,它没有任何限制,好比上文中为title字段建立的索引就是一个普通索引,
MyIASM中默认的BTREE类型的索引,也是咱们大多数状况下用到的索引。
2. 惟一索引
与普通索引相似,不一样的就是:索引列的值必须惟一,但容许有空值(注意和主键不一样)。
若是是组合索引,则列值的组合必须惟一,建立方法和普通索引相似。
3. 全文索引(FULLTEXT)
MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;
他们能够从CHAR、VARCHAR或TEXT列中做为CREATE TABLE语句的一部分被建立,或是随后
使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个
没有FULLTEXT索引的表中,而后建立索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。
不过切记对于大容量的数据表,生成全文索引是一个很是消耗时间很是消耗硬盘空间的作法。
4. 单列索引、多列索引
多个单列索引与单个多列索引的查询效果不一样,由于执行查询时,MySQL只能使用一个索引,
会从多个索引中选择一个限制最为严格的索引。
5. 组合索引(最左前缀)
平时用的SQL查询语句通常都有比较多的限制条件,因此为了进一步榨取MySQL的效率,就要考虑创建组合索引。

索引在什么状况下遵循最左前缀的规则?
联合索引的状况下遵循最左前缀的规则。

主键和外键的区别?
主键 : 该表中此列惟一,非空
外键 : 该列中的值必须是关联表中关联的数据

MySQL常见的函数?
详情见我博客

列举 建立索引可是没法命中索引的8种状况。
1.若是条件中有or,即便其中有条件带索引也不会使用(这也是为何尽可能少用or的缘由)
注意:要想使用or,又想让索引生效,只能将or条件中的每一个列都加上索引
2.对于多列索引,不是使用的第一部分,则不会使用索引
3.like查询是以%开头
4.若是列类型是字符串,那必定要在条件中将数据使用引号引用起来,不然不使用索引
5.若是mysql估计使用全表扫描要比使用索引快,则不使用索引
此外,查看索引的使用状况
show status like ‘Handler_read%';
你们能够注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next:这个值越高,说明查询低效

如何开启慢日志查询?
如何查看当前慢查询日志的开启状况?

在MySQL中输入命令:
showvariables like ‘%quer%’;
主要掌握如下的几个参数:
(1)slow_query_log的值为ON为开启慢查询日志,OFF则为关闭慢查询日志。
(2)slow_query_log_file 的值是记录的慢查询日志到文件中(注意:默认名为主机名.log,
慢查询日志是否写入指定文件中,须要指定慢查询的输出日志格式为文件,相关命令为:
show variables like ‘%log_output%’;去查看输出的格式)。
(3)long_query_time 指定了慢查询的阈值,即若是执行语句的时间超过该阈值则为慢查询语句,
默认值为10秒。
(4)log_queries_not_using_indexes 若是值设置为ON,则会记录全部没有利用索引的查询(注意:若是只是将log_queries_not_using_indexes设置为ON,而将slow_query_log设置为OFF,此时该设置也不会生效,即该设置生效的前提是slow_query_log的值设置为ON),通常在性能调优的时候会暂时开启。

数据库导入导出命令(结构+数据)?
 Mysqldump -h127.0.0.1 -P3306 -uroot -p密码 数据库名称>xx.sql

数据库优化方案?
详情见我博客

char和varchar的区别?
#char类型:定长,简单粗暴,浪费空间,存取速度快
#varchar类型:变长,精准,节省空间,存取速度慢

简述MySQL的执行计划?
详情见博客

在对name作了惟一索引前提下,简述如下区别:

select * from tb where name = ‘Oldboy-Wupeiqi’ 

select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1
全局遍历与只取一条

1000w条数据,使用limit offset 分页时,为何越日后翻越慢?如何解决?
越是向后,扫描的数据也就越多
解决方案:按照需求实现,可分为
限制浏览页数,
存储本页数据两端的主键,按主键查找后向前或向后取多少条
另外,若是数据没有缺失的话,还能够经过页数来计算主键

什么是索引合并?
使用多个主键进行查询

什么是覆盖索引?
查询内容在主键中能够直接查到

简述数据库读写分离?
创建主从关系,实现高可用,并减小主服务器的压力。

简述数据库分库分表?(水平、垂直)
水平 : 数据库字段过多
垂直 : 数据库行数太多
相关文章
相关标签/搜索