1. 小数的精度损耗的问题
2. bin 二进制 oct 八进制 hex 十六进制
3. 数据类型 number(int,float,bool,conmplex)、string、list、set、tuple、dict
4. 不可变的数据类型 或 可哈希的数据: Number、string、tuple
5. set的去重是通过两个函数__hash__和__eq__结合实现的。
5.1、当两个变量的哈希值不相同时,就认为这两个变量是不同的
5.2、当两个变量哈希值一样时,调用__eq__方法,当返回值为True时认为这两个变量是同一个,应该去除一个。返回FALSE时,不去重
某种意义上可以把集合当用值为空的字典
6. () > not > and > or 逻辑短路 True or ... False and ...
7. 算 位 比 身 成 逻 赋
8. 切片 左闭右开
9. // 地板除 可以获取一个数的高位 % 取余 可以获取一个数的低位
10. pass 占位符 break 终止所有循环 continue 跳过当前循环
11. 字符串相关的方法
capitalize title upper lower find index isdight isdecimal join split strip replace
12. list 相关的方法
切片 append insert extend pop remove clear index count sort reverse=True
13. 元组的相关方法
切片 count index
14. copy.copy copy.deepcopy
浅拷贝 只拷贝第一层 其余层次沿用以前的数据
深拷贝 完全独立的个体
15. dict 相关的方法
dic[] = xxx pop() popitem() clear() update() get() keys() values() .items()
16. set 的相关的方法
交差并补 & - | ^ add() clear() remove() issubset() issupperset()
frozenset 冰冻集合 不能进行修改 智能做 交差并补
17. 文件操作 w a r w+ a+ r+ wb rb
with open 异常自动保存退出 __exit__ __enter__ __finally__
read() seek(0) 开头 seek(0,2) 文件末尾 字节数
文件对象是 可迭代对象 具有可迭代性
fp.readable() fp.writeable() fp.readline() fp.readlines() fp.writelines() fp.truncate()
18. *args 收集普通实参 元组 **kwargs 收集关键字实参 字典
19. 全局变量: 在函数外部定义或函数内部定义并使用global 作用横跨整个文件
局部变量: 在函数内部定义 作用只限定于函数内部
LEGB 局部变量 外部变量 全局变量 内置变量
20. nolocal 用来修饰局部变量 修改当前作用域上一级的局部变量
21. 闭包
内函数使用了外函数的局部变量 外函数将内函数返回出来
装饰器就是闭包
22. 大驼峰命名法 FamilyNmae
23. 递归函数 自己调用自己的函数
24. 匿名函数 lanbda 三元运算符 lambad 参数: 返回值
25. map reduce sorted filter
26. 迭代器 能被next调用 不断返回下一个值的对象 优点: 节省空间 不是一下子全部数据加载到内存中
iter() next()
dir() 中 __iter__ __next__
from collection import Iterator, iterable
迭代器一定是可迭代对象 可迭代对象不一定是迭代器
27. 生成器 允许自定义逻辑的迭代器
yeild 或 生成器表达式 (i for i in range())
28. chr assic - > string ord
eval exec repr input hash
29. math模块
ceil() 向上取整 floor()向下取整 pi() 圆周率常数
30. json 序列化为字符串 pickle 序列化为字节流
ensure_ascii=False 显示中文
ensure_keys=True 对键进行排序
31. __init__ 实例化对象 初始化的时候触发
__new__
32. 继承 继承父类的方法与属性
supper() 用于调用父类的方法
33. jieba分词进行 提取高频词
34. orm 对象关系映射 主要是程序对象个挂逆行数据库的映射
提高开发效率 开发对象化 减少重复性代码
因为orm要转为sql 耗费时间长 内存多
35. restful 每一个url就是一种资源 通过http的方法 实现增删改查
drf django restful fromework 序列化器 视图类 其他功能 权限 认证 限流等等
36. 请求报文
请求行 请求方法 http版本
请求头部 user-agent accept host language content-type
请求体
37. 响应报文
状态行 http版本 状态码 描述信息
消息报头
响应体
400 请求与语法错误
401 未认证
403 权限不够
404 资源找不到
402 请求方法不对
38. http 请求流程
百度输入url 构建请求 dns 域名解析 ip端口 建立连接 tcp链接 http请求 服务器响应 然后渲染页面 结束通话
39. tcp的三次握手 四次挥手
最总的作用是什么 其实就是 规避掉那些 过期的连接
syn seq ack fin todo
40. https 比 http 安全 加入 ssl tls 加密传输协议
http 端口 80 https 端口 443
https 协议 需要申请到 ca 证书
41. 传输层 tcp udp
网络层 ip
数据链路层 arp parp
应用层 dns
42. tcp
利用滑动窗口来事项流量控制
滑动窗口 流量控制 拥塞控制
todo
43. 进程 线程 协程
进程 资源分配的最小单位
线程 cpu调度的基本单元
协程 微线程 一种用户态的轻量级线程
44. ACID 原子性 一致性 隔离性 持久性
ru 脏读 rc 不可重复读 rr 幻读 se 可序列化
45. mysiam 表级锁 Innodb 行锁 外键 事务 mvcc
mysql 查询不区分 大小写
46. 数据库的三大范式
1. 字段是具有原子性的 不可分割
2. 每一列都和主键相关
3. 确保每一列都要和主键列直接相关 而不是间接相关
47. truncate 与 delete 的区别
truncate 不支持 where 语句 直接删除数据
truncate 删除速度快 不知会 回滚 ddl操作 delete是 dml操作
48. 悲观锁 乐观锁
49. 如何确认sql是否命中 索引 explain
50. redis rdb aof
51. 慢查询调测三步
查看是否命中索引 是否包含不必要的数据列 数据条数是不是过大 要不要考虑分区分表
52. sql 调优
避免select * 指定必要的字段
使用连接 join 避免子查询
使用limit 限制条数
使用exists 代替 in
尽量避免使用佛那个 or in <> !=
53. B树的两个明显特点
树内的每个节点都存储数据
叶子节点五指针相邻
B+树
数据只出现在叶子节点
所有的叶子节点都增加了一个链指针
54. 列表去重 并按原始顺序
lst1 = set(lst)
lst1.sort(key=lst.index)
55. __new__ 实例化类生产对象的时候 cls
new 用于创建对象 init 用于初始化对象
class singleton():
__obj=None
def __new__(cls, *args, **kwargs):
if cls.__obj is None:
cls.__obj = object.__new__(cls)
return cls.__obj
56. 装饰器 在不改变原函数的基础上,增加新的功能
闭包 以及 flask 的注册路由 @
57. 正则表达式
\d \D \w \W [1-9a-zA-Z] ^ $
贪婪模式 非贪婪模式 ?
re.findall() re.search() re.match()
58. 反射
hasattr() 检测对象/类 是否有该成员
getattr() 获取对象成员的值
setattr delattr
59. 异常 try except raise
IndexError keyerror nameerror attributionerror assertionerror
60. tcp 面向连接 可靠的传输层协议
udp 不连接 不可靠的传输层协议
syn 创建连接 ack 确认响应 fin断开连接
msl 最大报文生存时间
61. 守护进程 darmon=True
start 启动子进程 join 阻塞 等待子进程完成
62. https 特性
基于tcp/ip协议
请求-响应协议
无状态
无连接
63. mvc 模型 mtv模型
64. python manage.py makemigrations
python manage.py migrate
65. 面向对象的三大特征 继承 封装 多态
继承 继承父类的方法与属性
封装 对类中成员属性和方法保护 控制外界对内部成员的访问
多态 不同的子类对象调用相同的父类方法 产生不同的执行结果
66. os.mknod mkdir remove rmdir
67. os.path.basename dirname splite join splitext getsize isdire abspath
68. supper 只应用与绑定方法 用于调用父类的绑定方法
69. issunclass isinstance mro
70. datetime
datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
71. 冒泡 快排
冒泡思路 相邻的两个数进行比较 进行排序
快排思路 选取一个值左右中间值 或基准值 然后对整个序列进行排序
def func(lst):
length = len(lst):
for i in range(length):
for j in range(i, length-j-1):
if lst[j] > lst[j+1]:
lst[j],lst[j+1] = lst[j+1]lst[i]
return lst
def func(lst):
if len(lst) < 2:
return lst
stand = lst[0]
a_lst = [i for i in lst[1:] if i < stand]
b_lst = [i for i in lst[1:] if i > stand]
return func(a_lst) + [stand] + func(b_lst)
72. pandas 常用方法
## 读写 pd.series #定义一维标记数组 pd.dataframe #定义数据框 pd.read_csv #读取逗号分隔符文件 pd.read_excel #读取 excel 表格 pd.to_excel #写入 excel 表格 pd.read_sql #读取 sql 数据 pd.read_table #读取 table pd.read_json #读取 json 文件 pd.read_html #读取 html pd.read_clipboard() #从剪切板读入数据 df.to_csv #写入 csv 文件 df.to_excel #写入 excel 文件 df.to_sql #写入 sql 表 df.to_json #写入 json 文件 df.to_html #写入 html 表格 df.to_clipboard() #写入剪切板 ## 数据展示和统计 df.info() #统计数据信息 df.shape() #统计行数和列数 df.index() #显示索引总数 df.columns() #显示数据框有哪些列 df.count() #显示有多少个记录 df.head(n) #返回前 n 个,默认 5 df.tail(n) #返回后 n 个 df.sample(n) #随机选取 n 行 df.sample(frac = 0.8) #百分比为 0.8 的选取 df.dtypes #查看每一列的数据类型 df.sum() #数据框按列求和 df.cumsum() #数据框累计求和 df.min() #给出每列的最小值 df.max() #给出每列的最大值 df['列名'].idxmin() #获取数据框某一列的最小值 myseries.idxmin() #获取 series 的最小值 df['列名'].idxmax() #获取数据框某一列的最大值 myseries.idxmax() #获取 series 的最大值 df.describe() #关数据的基本统计信息描述 df.mean() #给出数据框每一列的均值 df.median() #给出数据框每一列的中位数 df.quantile #给出分位数 df.var() #统计每一列的方差 df.std() #统计每一列的标准差 df.cummax() #寻找累计最大值,即已出现中最大的一个 df.cummin() #累计最小值 df['列名'].cumproad() #计算累积连乘 len(df) #统计数据框长度 df.isnull #返回数据框是否包含 null 值 df.corr() #返回列之间的相关系数,以矩阵形式展示 df['列名'].value_counts() #列去重后给每个值计数 ## 数据选择 myseries['列名'] #用中括号获取列 df['列名'] #选取指定列 df.列名 #同上 df[n0:n1] #返回 n0 到 n1 行之间的数据框 df.iloc[[m],[n]] #iloc按行号来索引,两层中括号,取第 m 行第 n 列 df.loc[m:n] #loc 按标签来索引,返回索引 m 到 n 的数据框,loc、iloc 主要针对行来说的 df.loc[:,"列1":"列2"] #返回连续列的所有行 df.loc[m:n,"列1":"列2"] #返回连续列的固定行 df['列名'][n] #选取指定列的第 n 行 df[['列1','列2']] #返回多个指定的列 ## 数据筛选和排序 df[df.列名 < n] #筛选,单中括号用于 bool 值筛选 df.filter(regex = 'code') #过滤器,按正则表达式筛选 df.sort_values #按某一列进行排序 df.sort_index() #按照索引升序排列 df['列名'].unique() #列去重 df['列名'].nunique() #列去重后的计数 df.nlargest(n,'列名') #返回 n 个最大值构成的数据框 df.nsmallest(n,'列名') #返回 n 个最小的数据框 df.rank #给出排名,即为第几名 ## 数据增加删除修改 df["新列"] = xxx #定义新列 df.rename #给列重命名 df.index.name = "index_name" #设定或者修改索引名称 df.drop #删除行或者列 df.列名 = df.列名.astype('category') #列类型强制转化 df.append #在末尾追加一行 del df['删除的列'] #直接删除一列 ## 特别的 df.列名.apply #按列的函数操作 pd.melt #将宽数据转化为长数据(拆分拉长),run 一下下面例子就知道什么意思了 pd.merge #两个数据表间的横向连接(内连接,外连接等) pd.concat #横向或者纵向拼接
df.fillna().values.tolist()
df[] df.at df.iat af.loc df.iloc
73. celery 常见面试题
生产者 消费者模式 工厂模式
74. 消息队列
kafka 基本的存取
rabbitmq 默认端口 15672 gust gust
75. 分布锁
setnx
延时双删机制 避免零为一个进程 有吧老数据加载到缓存中
过期机制怎么处理的
定期删除 + 懒汉式删除(查询的时候去判断 如果过期了先删除在做其他操作)
执行频率 执行时长
缓存淘汰机制
先进先出 fifo
最近最少使用 LRU 离当前最远时间的数据被淘汰 根据时间
最不经常使用 LFU 某一段时间没使用次数最高的淘汰 根据次数
缓存方案
客户端缓存 浏览器缓存 app缓存
cdn缓存
nginx缓存 静态资源
服务端缓存 本地缓存 外部缓存
数据库缓存
缓存穿透 缓冲查不到 数据库也查不到 数据库承担压力
1. 参数校验
2. 将查询为空的结果也加入到缓存中 可以加少许的过期时间
3. 引用布隆过滤器 在访问redis之前 判断数据是否存在
缓存击穿 reids 没有 数据库中有 一般在缓存初始化或者 key过期的情况 数据库压力
1. 设置热点缓存永不过期 数据更新的问题 另一个线程定期去更新缓存
2. db往缓存写的时候 加锁 防止并发
缓存雪崩 缓存大面积过期 压力来到db
1. 缓存失效时间 分散开 加随机值
正则 match group(1)
类方法 静态方法
类方法 中有cls 可以调用类属性类方法 静态方法
类方法中没有self 不能调用对象属性 对象方法 私有方法
静态方法没有cls 不能调用类属性 类方法
没有 self 也不能调用 对象属性 对象方法 私有方法
with 上下文管理器 enter() exit()
enter 进入with代码块前的准备操作
exit 退出时的善后操作
exec_type exc_val exc_tb
队列 和 栈
propety 获取私有属性
字典排序 sorted(dic.items(), key=lambda x:x[1])
参数传递是值传递还是引用传递
如果是不可变类型的话是值 可变类型的话是引用传递
最简单的办法就是 写个变量 写个函数进行修改 然后看值是否会变
回调函数 把函数当作参数去调用
search match
match是从最开始开始匹配的 但是search不是
读取大文件
分段取 循环
while True:
part = fp.read(1024)
if part:
yeild part
else:
return None
遍历目录
256 分个段 大于256是两外一个空间
小整数 <256 内存地址是一样的
lambda 函数 一行函数 主要是用在回调函数
主要应用中在 高阶函数中
迭代器 主要用于迭代 循环
生成器 是要是为了节省内存 大文件 大数据 为了防止一一下子加载到内存中
闭包 延迟绑定
猴子补丁 比如 协程库 gevent中就有用到
也就是来回切换 不用修改源代码
菱形继承
默认参数是列表 会是闭包
模块就是一个文件
包就是有一个 init文件的文件夹
reverse(fangfa)
90. 时间复杂度和空间复杂度 二者相对的矛盾的
占用的时间 占用内存
91. socket 搭建tcp服务
socket对象 搭建tcp协议的
监听 绑定 accept 三次握手 四次挥手
然后 send recev
关闭连接
92. select poll epoll
select 需要不断的去轮询数据 性能较低
epoll 不回去轮询 回去监听事件 数据有变化就通知
连接数少的情况下 select 会比 epoll 好
epoll 水平触发 和 边缘触发
不去处理但是每次都会通知
监控描述符发生变化 只会通知一次
93. linux 进程调度方法
先来先服务 短作业服务
高优先权优先调度算法
94. 运行态 进行态 阻塞态
95. 最左前缀原则
96. 索引底层
97. B树 B+树
B树 每个节点都可以存数据 B+树 只能是 叶子节点存数据
叶子节点有指针
所有存的数据都在叶子节点
一个节点有多个元素 也是有排序
innodb
page
子查询
索引原理 就是 吧无需的数据变得有序的查询
1. 把创建索引的列的内容进行排序
都结果生成倒排表
在倒排表内容上拼上数据地址链
在查询的时候先去拿到倒排表内容 然后在渠道具体数据地址连 从而拿到数据
acid是靠什么保证的
a原子性 uodo log 日志保证 记录需要回滚的日志信息
c 一致性 有其他三大特性保证的
i 隔离性 又 mvcc保证的
d 持久性 redo log
mvcc 多版本并发控制
就是读取诗句通过 类似快照的方式将数据保存起来
面试题
1. dataclass 数据类 开箱即用的方法来创建自定义数据, 可以直接实例化
2. 主键索引 和 唯一索引的 区别
主键创建和后一定存在一个唯一索引
唯一索引不一定是主键
唯一索引允许空置 主键不允许空值
一个表只能创建一个主键 但是可以创建多个唯一索引
主键是一种约束 唯一索引是一种索引
3. python的视图 view 视图去操作model获取数据然后将数据返回
一个视图函数(类),简称视图,是一个简单的Python 函数(类)包含的是业务逻辑,它接受Web请求并且返回Web响应。
matplotlib 散点图 折线图 直方图
4. 如何查看文件占用的进程 lsof
5. redis的数据类型 hash是干嘛的
用户对象,包含姓名,年龄,生日等信息,
6. 类方法 和静态方法的意义是什么
类方法需要用修饰器@classmethod来标识,告诉python解释器这是一个类方法
在开发时,如果需要在类中封装一个方法,这个方法既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法,这个时候,可以把这个方法封装成一个静态方法。
调用静态方法方式:不需要创建对象
调用静态方法可以无需创建对象
既不需要访问到实例的属性和方法 也不需要访问到类的属性和方法 那就需要静态方法
静态方法就是一个普通方法 就是和类相关 但是不一定要绑定
静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。
7. 项目框架 orm 数据相关的
k8s
openstack k8s 云计算
数据库相关的
mvcc 介于 rc rr 之间 ReadView