第一部分 Python基础篇(80题)
1、为什么学习Python?
1.python是脚本语言,作为程序员至少应该掌握一本通用脚本语言,因为脚本语言与编译语言的开发测试过程不同,可以极大的提高编程效率;
2.python差不多是现在最流行的通用脚本语言。 这里强调是通用。与python相似的只有ruby, tcl, perl等少数几种。 而python过去被称为脚本语言之王;
3.python有广泛的社区基本,可以说,只要你想到的问题,只要你需要使用的第三方库,基本上都是python的接口。so easy;
4.python开发效率高,同样的任务,大约是java的10倍,c++的10-20倍;
5.python在科研上有大量的应用,大数据计算,模拟计算,科学计算都有很多的包;
6.python几乎在每一个linux操作系统上都安装有。大部分unix系统也都缺省安装,使用方便;
7.python有独立的运行库,几乎不依赖第三方软件就可以完成大部分的系统运维和常见任务的开发;python帮助里还有许多例子代码,几乎拿过来略改一下就可以正式使用。
2、通过什么途径学习的Python?
1.自学
2.网上看视频
3.练习代码,写程序
3、Python和Java、PHP、C、C#、C++等其他语言的对比?
1.python语言,是一种面向对象、直译式计算机程序设计语言,Python语法简洁而清晰,具有丰富和强大的类库。
2.python能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起,能快速生成程序的原型,也提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。
4、简述解释型和编译型编程语言?
解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。
用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统,把源高级程序编译成为机器语言文件,翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,
5、Python解释器种类以及特点?
1、Cpython(最常用的版本)
Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
2、Jyhton
Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。
3、IronPython
Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)
4、PyPy(特殊)
Python实现的Python,将Python的字节码字节码再编译成机器码。
6、位和字节的关系?
8位(bit)=1字节(Byte),1024字节=1KB;
7、b、B、KB、MB、GB 的关系?
b 比特bit / 位
B——字节
KB——千比特
MB——兆比特
GB——吉比特
1 B = 8b (8个bit/ 位) 一个字节(byte)等于8位(bit)
1 kB = 1024 B (kB - kilobajt)
1 MB = 1024 kB (MB - megabajt)
1 GB = 1024 MB (GB - gigabajt)
8、请至少列举5个 PEP8 规范(越多越好)。
续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐3。当使用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。
当if语句的条件部分长到需要换行写的时候,注意可以在两个字符关键字的连接处(比如if),增加一个空格,再增加一个左括号来创造一个4空格缩进的多行条件。
在多行结构中的大括号/中括号/小括号的右括号可以与内容对齐单独起一行作为最后一行的第一个字符
空格是首选的缩进方式。
制表符只能用于与同样使用制表符缩进的代码保持一致。
Python3不允许同时使用空格和制表符的缩进。
混合使用制表符和空格缩进的Python2代码应该统一转成空格。
当在命令行加入-t选项执行Python2时,它会发出关于非法混用制表符与空格的警告。当使用–tt时,这些警告会变成错误。强烈建议使用这样的参数。
所有行限制的最大字符数为79。
没有结构化限制的大块文本(文档字符或者注释),每行的最大字符数限制在72。
顶层函数和类的定义,前后用两个空行隔开。
类里的方法定义用一个空行隔开。
导入通常在分开的行
导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。
推荐使用绝对路径导入,如果导入系统没有正确的配置(比如包里的一个目录在sys.path里的路径后),使用绝对路径会更加可读并且性能更好(至少能提供更好的错误信息)
9、通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”
v = “0b1111011”
print(int(v,2))
十进制转换成二进制:v = 18
v = 18
print("转换为二进制为:", bin(v))
八进制转换成十进制:v = “011”
v = “011”
print(int(v,8))
十进制转换成八进制:v = 30
print("转换为八进制为:", oct(v))
十六进制转换成十进制:v = “0x12”
v = “0x12”
print(int(v,16))
十进制转换成十六进制:v = 87
v = 87
print("转换为十六进制为:", hex(v))
10、请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
my_ip =input("需要转换的IP地址为")
my_ip = my_ip.split(".")
ip_1 =bin(int(my_ip[0]))[2:]
ip_2 =bin(int(my_ip[1]))[2:]
ip_3 =bin(int(my_ip[2]))[2:]
ip_4 =bin(int(my_ip[3]))[2:]
my_ip =int(ip_1+ip_2+ip_3+ip_4,base=2)
print(my_ip)
11、python递归的最大层数?
1000左右。理想状态下为一千,实际为998或999。
12、求结果:
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 False and 1 # #False
1 3 0 1 1 False
13、ascii、unicode、utf-8、gbk 区别?
编码 大小 支持语言
ASCII 1个字 英文
Unicode 2个字节(生僻字4个) 所有语言
UTF-8 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 所有语言
GBK 汉字和英文字母占2个字节 汉字和英文
14、字节码和机器码的区别?
字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
15、三元运算规则以及应用场景?
c= a if a>1 else b #
16、列举 Python2和Python3的区别?
区别太多随便记两个
17、用一行代码实现数值交换:
a = 1
b = 2
a,b=b,a
18、Python3和Python2中 int 和 long的区别?
•int(符号整数):通常被称为整数,没有小数点的正或负整数。
•long(长整数):或渴望,无限大小的整数,这样写整数和一个大写或小写的L
Python3中没有long函数
19、xrange和range的区别?
python3更新后,把xrange() 改名为range()
range
函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。
xrange
函数说明:和range 的用法完全相同,但是返回的是一个生成器。
20、文件操作时:xreadlines和readlines的区别?
* readline() >> reads a single line from file with newline at the end。
readline()读取一行内容,放到一个字符串变量,返回str类型。
* readlines() >> returns a list containing all the lines in the file
readlines() 读取文件所有内容,按行为单位放到一个列表中,返回list类型。
* xreadlines() >> Returns a generator to loop over every single line in the file
返回一个生成器,来循环操作文件的每一行。循环使用时和readlines基本一样,但是直接打印就不同
print f.xreadlines()
print f.readlines()
输出如下:
['f3tttt22221111133 ', 'fucttttx3tttt22221111133 ', 'fucttttx3tttt22221111133 ', 'fucttttx3tttt22221111133 ', 'fucttttx3tttt22221111133 ', 'fucttttx3tttt22221111133 ', 'fucttttx3tttt22221111133 ', 'fttx3tttt2222111113endend ']
所以二者类型不同。但使用时相同。
21、列举布尔值为False的常见值?
数字0
特殊值的 null
NaN
undefined
字符串
None
22、字符串、列表、元组、字典每个常用的5个方法?
列表-查 值 = 列表[index] 根据索引下标查找值 index = 列表.index(值) 从列表中找出某个值第一个匹配项的索引位置 count = 列表.count(值) 统计某个元素在列表中出现的次数 lenth = len(列表) 查询列表的长度,元素的个数 max(列表) ,min(列表) 查询列表中的最大值,最小值 列表-增 列表.append(值) 新增到末尾 列表.insert(下标,值) 插入到指定位置 列表.extend(列表) 列表末尾一次性追加另一个序列中的多个值 (用新列表扩展原来的列表)。 列表-改列表[下标] = 值 根据下标修改其值 列表-删 列表.pop() 删除末尾元素,并返回此元素 列表.pop(下标) 根据元素下标删除,并返回次元素 del 列表[下标] 根据元素下标删除 列表.remove(值) 根据元素的值删除 列表-判断 in(存在) 如果存在那么结果为True,否则为False not in(不存在) 如果不存在那么结果为True,否则False 列表-运算符 + * + 和 * 的操作符与字符串相似。 + 号用于组合列表,* 号用于重复列表。 列表-排序 列表.reverse() 反向列表中元素
8/50
列表.sort() 对原列表进行排序,如果指定参数,则使用 比较函数指定的比较函数 列表-切片 列表[num1:num2:num3] num1,num2都是列表的下标num3是间隔返 回一个新的列表
23、lambda表达式格式以及应用场景?
代替一些简单的函数,使得代码看上去更简洁并且可读性高
比如f = lambda x:x+=1
24、pass的作用?
1、pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作2、保证格式完整 3、保证语义完整
25、*arg和**kwarg作用
*args:可以理解为只有一列的表格,长度不固定。
**kwargs:可以理解为字典,长度也不固定。
*arg会把多出来的位置参数转化为tuple
**kwarg会把关键字参数转化为dict
26、is和==的区别
==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同
个人理解,==比较的是值,is比较的是地址。
27、简述Python的深浅拷贝以及应用场景?
深浅拷贝用法来自copy模块。
导入模块:import copy
浅拷贝:copy.copy
深拷贝:copy.deepcopy
字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层。
深拷贝的时候python将字典的所有数据在内存中新建了一份,所以如果你修改新的模版的时候老模版不会变。
相反,在浅copy 的时候,python仅仅将最外层的内容在内存中新建了一份出来,字典第二层的列表并没有在内存中新建,所以你修改了新模版,默认模版也被修改了。
28、Python垃圾回收机制?
Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。
在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。
在Python中,采用分代收集的方法。把对象分为三代,一开始,对象在创建的时候,放在一代中,如果在一次一代的垃圾检查中,改对象存活下来,就会被放到二代中,同理在一次二代的垃圾检查中,该对象存活下来,就会被放到三代中。
29、Python的可变类型和不可变类型?
不可变的:数字、字符串、元组
可变的:列表、字典是
30、求结果:
v = dict.fromkeys(['k1','k2'],[])
v["k1’].append(666)
print(v)
v["k1’] = 777
print(v)
31、求结果:
32、列举常见的内置函数?
33、filter、map、reduce的作用?
34、一行代码实现9*9乘法表
print ' '.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)])
35、如何安装第三方模块?以及用过哪些第三方模块?
36、至少列举8个常用模块都有那些?
1.time模块
time模块提供各种操作时间的函数
2. datetime模块
3.sys模块
用于提供对解释器相关的访问及维护,并有很强的交互功能
4.pickle模块
pickle,用于python特有的类型 和 python的数据类型间进行转换
pickle模块提供了四个功能:dumps、dump、loads、load
5.os模块
作用:用于提供系统级别的操作
6.hashlib模块
作用:用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
7.random
作用:生成随机变量
8.shutil模块
9.XML处理模块
10.logging 模块
python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为debug(),info(),warning(),error()andcritical()5个级别。
11.、configparser模块
用于生成和修改常见配置文档
12.json & pickle 模块
用于序列化的两个模块
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
37、re的match和search区别?
match()函数只检测RE是不是在string的开始位置匹配,
search()会扫描整个string查找匹配;
也就是说match()只有在0位置匹配成功的话才有返回,
如果不是开始位置匹配成功的话,match()就返回none。
38、什么是正则的贪婪匹配?
如:String str="abcaxc";
Patter p="ab*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。
39、求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
40、求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
41、def func(a,b=[]) 这种写法有什么坑?
deffunc(a,b=[]):
b.append(a)
print(b)
func(1)
func(1)
func(1)
func(1)
结果为:
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,第二次执行还是用第一次执行的时候实例化的地址存储,所以三次执行的结果就是 [1, 1, 1] ,想每次执行只输出[1] ,默认参数应该设置为None。
42、如何实现 “1,2,3” 变成 ["1’,’2’,’3’] ?
a=“1,2,3”
a.split(",")
43、如何实现["1’,’2’,’3’]变成[1,2,3] ?
a=["1’,’2’,’3’]
ls=[]
for i in a:
a.append(i)
44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
a为列表嵌套数字
b为列表嵌套的set集合
c为列表嵌套元组
45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?f
46、一行代码实现删除列表中重复的值 ?
把列表转成set集合即可
47、如何在函数中设置一个全局变量 ?
x=1
globle x
48、logging模块的作用?以及应用场景?
logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。所以,你的应用日志可以将你自己的日志信息与来自第三方模块的信息整合起来。
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
49、请用代码简答实现stack 。
stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出
50、常用字符串格式化哪几种?
Python的字符串格式化常用的有三种!
第一种:最方便的
缺点:需一个个的格式化
print("hello %s and %s"%("df","another df"))
第二种:最好用的
优点:不需要一个个的格式化,可以利用字典的方式,缩短时间
print("hello %(first)s and %(second)s"%{"first":"df","second":"another df"})
第三种:最先进的
优点:可读性强
print("hello {first} and {second}".format(first="df",second="another df"))
51、简述 生成器、迭代器、可迭代对象 以及应用场景?
52、用Python实现一个二分查找的函数。
53、谈谈你对闭包的理解?
54、os和sys模块的作用?
OS模块是Python标准库中的一个用于访问操作系统功能的模块,使用OS模块中提供的接口,可以实现跨平台访问
sys模块主要是用于提供对python解释器相关的操作
55、如何生成一个随机数?
引入random模块 random.random()
56、如何使用python删除一个文件?
os.remove(path)
57、谈谈你对面向对象的理解?
面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想
在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例
面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息
58、Python面向对象中的继承有什么特点?
继承的优点:
1、建造系统中的类,避免重复操作。
2、新类经常是基于已经存在的类,这样就可以提升代码的复用程度。
继承的特点:
1、在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
59、面向对象深度优先和广度优先是什么?
60、面向对象中super的作用?
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
61、是否使用过functools中的函数?其作用是什么?
Python的functools模块用以为可调用对象(callable objects)定义高阶函数或操作。简单地说,就是基于已有的函数定义新的函数。
所谓高阶函数,就是以函数作为输入参数,返回也是函数。
1. functools模块的引用
from functools import partial
2. functools模块的组成
partial(func, *args, **keywords)
通过封装,重新定义已有的函数,如增减参数、设置初始值或改变返回值。
该函数的返回partial对象,其中包含3个只读属性:
partial.func
partial.args
partial.keywords
@total_ordering
修饰class
实现多个比较操作方法,如__eq__, __lt__等
@lru_cache(maxsize=128, typed=False)
修饰方法,重新定义已有的函数
只存在于内存中
@singledispatch(default)
修饰方法
将函数转换为 single-dispatch generic function
@wraps(wrapped_func, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
调用update_wrapper()方法的简便实现
update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
reduce(function, iterable[, initializer])
cmp_to_key(func)
62、列举面向对象中带双下划线的特殊方法,如:__new__、__init__
63、如何判断是函数还是方法?
函数:
函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用。
方法:
方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作,使用时采用点方法。
64、静态方法和类方法区别?
classA(object):
deffun_a(self):#实例方法
pass
@staticmethod
deffun_b():#静态方法
pass
@classmethod
deffun_c(cls):#类方法
pass
虽然静态方法和类方法调用方式都一样,都可以通过【类.方法名】来使用,但是类方法中有默认属性cls,指向自身的类,所以一般如果是单一的工具函数定义成静态方法,如果还需要调用类中其他的静态方法,或者类方法的函数定义成类方法。
一、先是在语法上面的区别:
1、静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数;
2、静态方法是无妨访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量
二、使用的区别:
由于静态方法无法访问类属性,实例属性,相当于一个相对独立的方法,跟类其实并没有什么关系。这样说来,静态方法就是在类的作用域里的函数而已
65、列举面向对象中的特殊成员以及应用场景
66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数
67、什么是反射?以及应用场景?
68、metaclass作用?以及应用场景?
69、用尽量多的方法实现单例模式。
70、装饰器的写法以及应用场景。
71、异常处理写法以及如何主动跑出异常(应用场景)
72、什么是面向对象的mro
73、isinstance作用以及应用场景?
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类型?
76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
77、什么是断言?应用场景?
78、有用过with statement吗?它的好处是什么?
79、使用代码实现查看列举目录下的所有文件。
80、简述 yield和yield from关键字。
第二部分 网络编程和并发(34题)
1、简述 OSI 七层协议。
1、物理层
为数据链路层提供物理连接,实现比特流的透明传输,所传输数据的单位是比特,该层定义了通信设备与传输线接口硬件的电气、机械以及功能和过程的特性。
2、数据链路层
在通信的实体之间建立数据链路连接,传送以帧为单位的数据,通过检查发生在连接通信系统间传送路上的比特错误并进行恢复,确保比特序列组成为数据流准确无误地传送给对方的系统。数据链路层在相邻的节点之间实现透明的高可靠性传输。
3、网络层
解决多节点传送时的路由选择、拥挤控制及网络互连等,控制分组传送系统的操作,它的特性对高层是透明的,同时,根据传输层的要求选择服务质量,并向传输层报告未恢复的差错。
4、传输层
为两个端系统(源站和目标站)的会话层之间建立一条传输连接,可靠、透明地传送报文,执行端一端差错控制、顺序和流量控制、管理多路复用等。本层提供建立、维护和拆除传送连接的功能,并保证网络连接的质量。它向高层屏蔽了下层数据通信的细节,因而是OSI网络参考模型中最需要的一层。
5、会话层
不参与具体的数据传输,但对数据传输的同步进行管理。它主要负责提供两个进程之间建立、维护和结束会话连接功能,同时要对进程中必要的信息传送方式、进程间的同步以及重新同步进行管理。
6、表示层
解决在两个通信系统中交换信息时不同数据格式的编码之间的转换,语法选择,数据加密与解密及文本压缩等。
7、应用层
负责向用户提供各种网络应用服务,如文件传输、电子邮件、远程访问等。把进程中于对方进程通信的部分放入应用实体中,同时,对各种业务内容的通信功能进行管理。
2、什么是C/S和B/S架构?
3、简述 三次握手、四次挥手的流程。
4、什么是arp协议?
5、TCP和UDP的区别?
6、什么是局域网和广域网?
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框架的使用和应用?
第三部分 数据库和缓存(46题)
1、列举常见的关系型数据库和非关系型都有那些?
2、MySQL常见数据库引擎及比较?
3、简述数据三大范式?
4、什么是事务?MySQL如何支持事务?
5、简述数据库设计中一对多和多对多的应用场景?
6、如何基于数据库实现商城商品计数器?
7、常见SQL(必备)
详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
8、简述触发器、函数、视图、存储过程?
9、MySQL索引种类
10、索引在什么情况下遵循最左前缀的规则?
11、主键和外键的区别?
12、MySQL常见的函数?
13、列举 创建索引但是无法命中索引的8种情况。
14、如何开启慢日志查询?
15、数据库导入导出命令(结构+数据)?
16、数据库优化方案?
17、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 分页时,为什么越往后翻越慢?如何解决?
21、什么是索引合并?
22、什么是覆盖索引?
23、简述数据库读写分离?
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?
第四部分 前端、框架和其他(155题)
1、谈谈你对http协议的认识。
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请求中常见的请求方式?
16、列举Http请求中的状态码?
17、列举Http请求中常见的请求头?
18、看图写结果:
19、看图写结果:
20、看图写结果:
21、看图写结果:
22、看图写结果:
23、看图写结果:
24、django、flask、tornado框架的比较?
25、什么是wsgi?
26、django请求的生命周期?
27、列举django的内置组件?
28、列举django中间件的5个方法?以及django中间件的应用场景?
29、简述什么是FBV和CBV?
30、django的request对象是在什么时候创建的?
31、如何给CBV的程序添加装饰器?
32、列举django orm 中所有的方法(QuerySet对象的所有方法)
33、only和defer的区别?
34、select_related和prefetch_related的区别?
35、filter和exclude的区别?
36、列举django orm中三种能写sql语句的方法。
37、django orm 中如何设置读写分离?
38、F和Q的作用?
39、values和values_list的区别?
40、如何使用django orm批量创建数据?
41、django的Form和ModeForm的作用?
42、django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
43、django的Model中的ForeignKey字段中的on_delete参数有什么作用?
44、django中csrf的实现机制?
45、django如何实现websocket?
46、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
47、django中如何实现orm表中添加数据时创建一条日志记录。
48、django缓存如何设置?
49、django的缓存能使用redis吗?如果可以的话,如何配置?
50、django路由系统中name的作用?
51、django的模板中filter和simple_tag的区别?
52、django-debug-toolbar的作用?
53、django中如何实现单元测试?
54、解释orm中 db first 和 code first的含义?
55、django中如何根据数据库表生成model中的类?
56、使用orm和原生sql的优缺点?
57、简述MVC和MTV
58、django的contenttype组件的作用?
59、谈谈你对restfull 规范的认识?
60、接口的幂等性是什么意思?
61、什么是RPC?
62、Http和Https的区别?
63、为什么要使用django rest framework框架?
64、django rest framework框架中都有那些组件?
65、django rest framework框架中的视图都可以继承哪些类?
66、简述 django rest framework框架的认证流程。
67、django rest framework如何实现的用户访问频率控制?
68、Flask框架的优势?
69、Flask框架依赖组件?
70、Flask蓝图的作用?
71、列举使用过的Flask第三方组件?
72、简述Flask上下文管理流程?
73、Flask中的g的作用?
74、Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
75、为什么要Flask把Local对象中的的值stack 维护成一个列表?
76、Flask中多app应用是怎么完成?
77、在Flask中实现WebSocket需要什么组件?
78、wtforms组件的作用?
79、Flask框架默认session处理机制?
80、解释Flask框架中的Local对象和threading.local对象的区别?
81、Flask中 blinker 是什么?
82、SQLAlchemy中的 session和scoped_session 的区别?
83、SQLAlchemy如何执行原生SQL?
84、ORM的实现原理?
85、DBUtils模块的作用?
86、以下SQLAlchemy的字段是否正确?如果不正确请更正:
from datetime import datetime
from sqlalchemy.ext.declarative
import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
Base = declarative_base()
class UserInfo(Base):
__tablename__ = 'userinfo'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(64), unique=True)
ctime = Column(DateTime, default=datetime.now())
87、SQLAchemy中如何为表设置引擎和字符编码?
88、SQLAchemy中如何设置联合唯一索引?
89、简述Tornado框架的特点。
90、简述Tornado框架中Future对象的作用?
91、Tornado框架中如何编写WebSocket程序?
92、Tornado中静态文件是如何处理的?如:
93、Tornado操作MySQL使用的模块?
94、Tornado操作redis使用的模块?
95、简述Tornado框架的适用场景?
96、git常见命令作用:
97、简述以下git中stash命令作用以及相关其他命令。
98、git 中 merge 和 rebase命令 的区别。
99、公司如何基于git做的协同开发?
100、如何基于git实现代码review?
101、git如何实现v1.0 、v2.0 等版本的管理?
102、什么是gitlab?
103、github和gitlab的区别?
104、如何为github上牛逼的开源项目贡献代码?
105、git中 .gitignore文件的作用?
106、什么是敏捷开发?
107、简述 jenkins 工具的作用?
108、公司如何实现代码发布?
109、简述 RabbitMQ、Kafka、ZeroMQ的区别?
110、RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
111、RabbitMQ如何对消息做持久化?
112、RabbitMQ如何控制消息被消费的顺序?
113、以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
114、简述 celery 是什么以及应用场景?
115、简述celery运行机制。
116、celery如何实现定时任务?
117、简述 celery多任务结构目录?
118、celery中装饰器 @app.task 和 @shared_task的区别?
119、简述 requests模块的作用及基本使用?
120、简述 beautifulsoup模块的作用及基本使用?
121、简述 seleninu模块的作用及基本使用?
122、scrapy框架中各组件的工作流程?
123、在scrapy框架中如何设置代理(两种方法)?
124、scrapy框架中如何实现大文件的下载?
125、scrapy中如何实现限速?
126、scrapy中如何实现暂定爬虫?
127、scrapy中如何进行自定制命令?
128、scrapy中如何实现的记录爬虫的深度?
129、scrapy中的pipelines工作原理?
130、scrapy的pipelines如何丢弃一个item对象?
131、简述scrapy中爬虫中间件和下载中间件的作用?
132、scrapy-redis组件的作用?
133、scrapy-redis组件中如何实现的任务的去重?
134、scrapy-redis的调度器如何实现任务的深度优先和广度优先?
135、简述 vitualenv 及应用场景?
136、简述 pipreqs 及应用场景?
137、在Python中使用过什么代码检查工具?
138、简述 saltstack、ansible、fabric、puppet工具的作用?
139、B Tree和B+ Tree的区别?
140、请列举常见排序并通过代码实现任意三种。
141、请列举常见查找并通过代码实现任意三种。
142、请列举你熟悉的设计模式?
143、有没有刷过leetcode?
144、列举熟悉的的Linux命令。
145、公司线上服务器是什么系统?
146、解释 PV、UV 的含义?
147、解释 QPS的含义?
148、uwsgi和wsgi的区别?
149、supervisor的作用?
150、什么是反向代理?
151、简述SSH的整个过程。
152、有问题都去那些找解决方案?
153、是否有关注什么技术类的公众号?
154、最近在研究什么新技术?
155、是否了解过领域驱动模型?
统计:80 + 34 + 46 + 155 = 315题