一、Python基本知识
√ 数据类型:int\float\bool\list\tuple\dict\set
list:[]表示,有序,元素可修改,索引访问,可切片
tuple:()表示,有序,元素不可修改不可删除但可以被重写(但可通过切片和拼接形式完成修改和删除),索引访问,可切片
list和tuple区别:
1.定义一个单元素列表a = [1],单元素元祖b = (1,)
而b = (1)中的括号会被认为是运算符,b则是int类型
2.tuple性能速度会更好,比方定义同样元素的list和tuple,tuple花的时间更少
3.tuple的使用场景:返回一个标准变量,比方(地球经度a,地球纬度b)虽然成员ab不能变,但是可以通过改变ab的值来改变元祖的数据
dictionary:{}表示,无序,元素可修改可删除,key访问,不可切片
删除元素 del dict['a']
清空字典:dict.clear()
删除字典:del dict(释放内存地址)
set:{}表示,无序且去重
初始化set:s = set(),或者s = {1,2}
添加元素 s.add(a)/s.update(a)
移除元素 s.remove(a)
随机删除一个元素 s.pop()
清空:s.clear()
√ 迭代器
1.str,list,tuple都可以使用迭代器
2.iter()创建迭代对象和next()遍历迭代对象
3.只能前进不能后退
4.可以使用常规for循环操作迭代对象:
for i in it:
print(i)
5.也可以使用next()来进行元素遍历:
while True:
try:
print(next(i))
except stopIteration:
break
√ 生成器:
https://www.cnblogs.com/liangmingshen/p/9706181.html
https://www.runoob.com/python3/python3-iterator-generator.html
1.创建一个生成器:g = (x * x for x in range(10))
2.如果一个函数中包含了yield关键字,那么这个函数就是一个generator
下次迭代时,代码从yield的下一条语句开始执行
√ 装饰器:
https://www.runoob.com/w3cnote/python-func-decorators.html
1.装饰器是一个函数
2.在不影响其他函数的基础上,修改其他函数的功能
3.业务场景:
日志处理
性能测试:记录方法的运行次数,运行时间
权限校验
√ __name__ == '__main__':
1.https://www.runoob.com/note/39287
2.https://www.runoob.com/note/39287
3.一个文件可以独立运行也可以在其他文件里被当作模块调用,如果独立运行时,__name__ == '__main__',否则则为文件名
二、Redis,db
√ Redis的三种异常及解决方案
穿透:查询一个一定不会存在的数据,这个操作就会穿透缓存直达db,如果批量类似请求就会对数据库带来威胁
🔺 解决方案:
1.bloom filter:将所有查询条件生成一个bitmap,db查询前先经过这个bitmap过滤
2.空值缓存:第一次查询到不存在的数据后,将key和空值一起放入缓存,设置一个较短的失效时间,减轻db压力
雪崩:大量缓存信息同时失效,造成大量事务直接到db层
🔺 解决方案:
1.错开缓存失效时间
2.缓存永不失效,但这样缓存数据会占用很大空间
3.设置互斥锁重建缓存,但这样会降低系统的QPS(每秒查询率)
击穿:高并发的缓存数据失效:例如热点话题
🔺 解决方案:
1.设置双缓存
三、HTTP
√ http有哪些内容
request:
状态信息:请求方式/协议版本/路径
请求头:
Accept信息
User-Agent
Host
Cache-Control
Connection
Date
Cookie信息
请求主体
form-data:提交文件
form-urlencoded
raw
binary
response:
状态信息:协议版本/状态码
响应头:
Content信息
Allow支持的请求方式
Cache-Control
Connection
Expires过期时间
Date
Location重定向访问地址
Access-Control-Allow-等信息,跨域时添加头部允许
Modify信息:协商缓存使用字段
响应主体:
????? HTTP2优点:
1.多路复用:HTTP1是半双工的,2是全双工的
2.首部压缩:减少首部大小
3.服务推送:服务器可以将请求方所需要的数据一次性发送,还能设置缓存
4.二进制分帧:?????????????
√ 深入了解强缓存和协商缓存:
1.response中Cache-Control:no-cache
2.使用Modify和Etag字段信息
四、Coding(LeetCode很重要)
√ 1.(这个题目很重要)一个带有数字和字符的字符串,没碰到一个数字就将其前面的字符重复N次
例如:a2b3 -> aabbb:2tencent_strToAlpha.py
√ 2.判断一个字符串是IP地址(还需要手写一个ipv6):2tencent_isIp.py
√ 3.实现1的阶乘到50阶乘之和:2tencent_kpSum.py
√ 4.一个字符串中,统计出现次数最多的字母,若有两个则一起返回:maxCountAndWord.py
√ 5.abcbcd字串中去掉bc(考虑abbcc,去掉bc后还有一个bc):rmSubStr.py
√ 6.1-n中找素数(或者质数):prime.py
7.查找QQ号,二分查找,哈希查找,二叉查找
8.各种排序算法的原理,时间复杂度怎么来的(非递归算法)
√ 9.python文件的处理,以及json的转换:postFromFile.py
√ 10.request+json+os:postFromFile.py
√ 字符串压缩/重复23次:2tencent_strToAlpha.py
√ 用装饰器写一个日志功能:deco_logging.py
12.LeetCode 简单-中等,注意贪心算法的题目
13.动态规划,最大公共字串
五、Linux命令:
√ 文件操作:
ls:查看当前目录中的文件
pwd:查看绝对路径
cd:切换文件
rm:删除
mk:新建:
cp:复制
mv:移动
??? 进程查看:
ps:程序状态
ps -ef | grep 进程名/进程号:查看这个进程的pid信息
ps -l/ps -aux 都可以看到CPU占用情况
top:动态查看进程变化
-d n:每n秒更新一次进程信息
netstat:
netstat -a 列出所有端口号
netstat -anp 8080 可以查看被哪个进程占用
netstat -tlnp TCP网络数据,网络监听的服务,端口号,pid
lsof:显示被进程打开的文件/列出打开此文件的进程
lsof 不加参数表示,列出所有被打开的文件
lsof /filepath/file 查看使用这个文件的进程名
lsof |grep 进程名 列出进程所打开的文件
lsof -i:port 列出哪些文件在使用这个端口号
lsof -p 123,456,789 列出进程号对应的文件信息
echo:
echo $path
六、逻辑智力题:
√ 1.一个国家有病马,每天一定要枪杀,第一天几声枪响,第二天几声枪响,问一共几匹马:3匹病马
七、其他:
√ 进程和线程,线程的状态切换:
1.进程是资源分配的基本单位,线程是程序调度的基本单位,所以进程之间的切换开销比较大
2.线程可以说是轻量级进程
3.当一个进程中线程数量为1时,可以理解为这个进程是单线程的
4.如果进程中线程数量>=2,那么这个进程的执行是由CPU在每个时间片调度不同的线程来完成的
???? cookie,session区别:
cookie存放于客户端,session存放于服务器
session的运行依赖session_id,而session_id是由服务器生成,但存放于cookie中的
cookie有大小个数限制,session没有
session相比于cookie更加安全
√ mysql和oracle区别
一个免费,一个收费
oracle更加安全,会校验更多用户信息
语法也有不同
数据类型不同,oracle支持更多数据类型
√ 页面出现网络繁忙的原因:
抓包定位前后端问题
查看后台日志,看是否收到前端请求
是否关联的其他服务
程序的负载
√ 深拷贝和浅拷贝是什么意思:
https://www.cnblogs.com/xiaxiaoxu/p/9742452.html
1.赋值(对象引用):两个对象,地址和数据会完全相互影响
2.浅拷贝(拷贝父对象,不会拷贝对象的内部的子对象。):新对象重新开辟了空间,但是里面元素的地址和原对象相同
3.深拷贝(完全拷贝了父对象及其子对象):新对象和原对象是完全不同的地址,元素地址也不一样,完全不会相互影响
import copy
a=[1,2,3,4,5,['a','b']]
b = a # 赋值
c = copy.copy(a) # 浅拷贝
d = copy.deepcopy(a) # 深拷贝
a.append(6)
c[5].append('c')
c.append(10)
print(a, id(a), id(a[6]))
print(b, id(b), id(b[6]))
print(c, id(c), id(c[6]))
print(d, id(d), id(d[0]))
??? python内存管理:
https://www.cnblogs.com/sunBinary/p/10934140.html
1.引用计数
2.垃圾回收
4.内存池机制(根据256KB分为大小内存进行不同处理)
??? python模块
[sys,functools]:sys.getsizeof(object),sys.exit(),sys.getrefcount()
[os]:文件处理
[math,md5,re]:math.trunc(4.5)
[json,requests]
[unittest]
[time,datetime,date]
[random]:random.random(),random.randrange(m, n)
[copy]
[timeit]:测量代码段执行时间
√ 推导式和for循环区别:
https://blog.csdn.net/weixin_44695969/article/details/96889580
推导式性能更好,但是多个推导式嵌套可读性并不强
√ 基本的正则表达式:
re模块
compile():用于生成正则表达式方法,供search()和match()使用
search():
match():
√ 牛客-go,GO语言单元测试如何进行:
1.测试函数的文件名:被测函数所在的文件名_test.go
2.测试函数的命令:Test+被测函数名()
3.测试函数必须接收一个testing.T的指针,且不能返回任何值
Nginx配置:
1.查看nginx是否启动:ps -ef | grep nginx
2.修改配置文件后,测试配置文件正确性:./nginx -t
3.重启: ./nginx -s reload 或者 kill -HUP 进程号
4.设置生效的配置文件:nginx -c 配置文件路径
5.负载均衡配置:upstream
【 二面的一些问题:】
1.Q音搜索页面如何测试
2.数字专辑的支付H5页面如何测试
3.编程题:一个文件里面有 http:www.abc.com 200 234:getAvgTime.py
分别对应url,状态码,耗时(ms)信息,请读取文件并返回状态码为 200的平均耗时
4.两个盲人摸混在一起的8双袜子(4黑4白,每双袜子都是用标签绑在一起的),如何使每个盲人各4双袜子(2黑2白)
5.两个大小重量外观质感均相同的金球和铅球(空心球),如何区分
6.python做过哪些事情?说明一下appium框架的原理
网友评论