很不错——篇
宝藏文档:https://www.cnblogs.com/xiaobaibailongma
1、编程篇
一、排序
1 ls=[3,2,5,1] 2 # 方法一: 3 def bubble(ls): 4 for i in range(0,len(ls)): 5 for j in range(i+1,len(ls)): 6 if ls[i]>ls[j]: 7 ls[i],ls[j]=ls[j],ls[i] 8 return ls 9 # print(bubble(ls)) 10 # 方法二: 11 print(sorted(ls,reverse=True))
二、求最大值、最小值
1 ls=[3,2,5,1,5] 2 # 方法一 3 # print(max(ls)) 4 # 方法二 5 max_val=0 6 for i in ls: 7 if i>max_val: 8 max_val=i 9 print(max_val)
三、去重
1 ls=[3,2,3,5,1,5,5] 2 # 方法一: 3 # print(set(ls)) 4 # 方法二: 5 ls2=[] 6 for i in ls: 7 if i not in ls2: 8 ls2.append(i) 9 print(ls2)
四、统计出现的次数
1 ls=[3,2,3,5,1,5,5] 2 # 方法一: 3 d={} 4 for i in ls: 5 d[i]=ls.count(i) 6 print(d)
方法二:
ls2=list(set(ls))
for i in ls2:
ls.count(i)
五、倒序
1 str="tom" 2 str2='' 3 c = list(str) 4 # 方法一 5. print(d[::-1])
6 # 方法二 7 for i in range(len(c)): 8 str2+=c.pop() 9 # 方法三 10 leng=len(str) 11 leng2=len(str)-1 12 for i in range(leng): 13 str2+=c[leng2-i]
六、递归
1 p = r"D:\测试用例" 2 3 import os 4 def getFile(path): 5 p = os.listdir(path) 6 for i in p: 7 f = os.path.join(path,i) 8 if os.path.isdir(f): 9 getFile(f) 10 else: 11 print(f) 12 getFile(p)
七、装饰器
带参数的装饰器
1 def outer2(val): 2 def outer(fun): 3 def inner(*args,**kwargs): 4 if val==1: 5 print("decoration1..") 6 if val==2: 7 print("decoration2..") 8 fun(*args,**kwargs) 9 return inner 10 return outer 11 12 @outer2(2) 13 def one(): 14 print('ok...') 15 one()
八、字典排序
1 d = {"1":"tom","3":"Lily","2":"Jim"} 2 # 方法一: 3 c = sorted(d.items(),key=lambda x:x[0]) 4 # print(c) 5 # 方法二: 6 keys = [i for i in d.keys()] 7 skeys = sorted(keys) 8 vals=[] 9 for i in skeys: 10 for k,v in d.items(): 11 if i==k: 12 vals.append(v) 13 # cc = map(lambda x,y:{x:y},skeys,vals)
d={}
for i in range(len(ls)):
d[ls[i]]=ls2[i]
print(d)
九、最长的公共前缀
1 ls=["floght","floor","floy","flower"] 2 min_lenght = len(ls[0]) 3 for i in ls: 4 if min_lenght>len(i): 5 min_lenght=len(i) 6 ls2=[] 7 str2='' 8 for i in range(min_lenght): 9 for u in ls: 10 ls2.append(u[i]) 11 if ls2.count(u[i])==min_lenght: 12 str2+=u[i] 13 ls2=[] 14 print(str2)
十、递归求和
1 def get_sum(num): 2 if num<=1: 3 return 1 4 return num+get_sum(num-1) 5 print(get_sum(100))
十、递归树
1 menu_items = [ 2 {'id': 1, 'name': '一级菜单', 'status': 1, 'parent_id': 0}, 3 {'id': 2, 'name': '二级菜单', 'status': 1, 'parent_id': 1}, 4 {'id': 3, 'name': '三级菜单', 'status': 1, 'parent_id': 2}, 5 # 其他菜单项... 6 ] 7 8 def build_menu(menu_items, parent_id=0): 9 menu = [] 10 for item in menu_items: 11 if item['parent_id'] == parent_id: 12 child_menu = build_menu(menu_items, item['id']) 13 cc = child_menu 14 menu.append({ 15 'name': item['name'], 16 'child': child_menu 17 }) 18 return menu 19 print(build_menu(menu_items))
十一、找出连续的值
ls=[1,2,3,5,6,8] ls2=[] ls3=[] for i in ls: ls2.append(i) if i+1 not in ls: if ls2[0]==ls2[-1]: ls3.append(ls2[0]) else: ls3.append([ls2[0],ls2[-1]]) ls2=[] print(ls3)
十二、LRU 算法
https://www.jb51.net/article/249285.htm?tdsourcetag=s_pcqq_aiomsg
https://www.jianshu.com/p/e41ec08e4aa6
1 from collections import OrderedDict 2 class LRUCache: 3 def __init__(self,size): 4 self.size = size 5 self.dic = OrderedDict() 6 def set(self,key,val): 7 if key in self.dic: 8 self.dic.pop(key) 9 if self.size == len(self.dic): 10 self.dic.popitem(last=False) 11 self.dic.update({key:val}) 12 def get(self,key): 13 val = self.dic.get(key) 14 self.dic.pop(key) 15 self.dic.update({key: val}) 16 return val 17 18 r = LRUCache(3) 19 r.set("1", "1") 20 r.set("2", "2") 21 r.set("1", "3") 22 # r.set("1", "4") 23 # r.set("1", "5") 24 print(r.dic) 25 r.get("1") 26 print(r.dic) 27 # r.set("4", "4") 28 # print(r.dic)
from collections import OrderedDict
class LRUCache:
def __init__(self,size):
self.size = size
self.dic = OrderedDict()
def set(self,key,val):
if key in self.dic:
self.dic.pop(key)
if self.size == len(self.dic):
self.dic.popitem(last=False)
self.dic.update({key:val})
def get(self,key):
val = self.dic.get(key)
self.dic.pop(key)
self.dic.update({key: val})
return val
r = LRUCache(3)
r.set("1", "1")
r.set("2", "2")
r.set("1", "3")
# r.set("1", "4")
# r.set("1", "5")
print(r.dic)
r.get("1")
print(r.dic)
# r.set("4", "4")
# print(r.dic)
2、linux
1、展示所有upd\tcp
lsof -i
2、占用端口80
lsof -i:80
3、一行命令杀死占用端口80 的
lsof -i:80|awk '{print $2}'|xargs kill
4、一行命令杀死进程名称为python的
ps aux | grep python | awk '{print $2}' | xargs kill
5、查看100行到200行的日志
head -n 200 filname | tail -n 100
6、查看5行到6行的日志
head -n 6 filname | tail -n 1
7、查看后100行的含有关键字的日志
head -n 100 filname | grep "关键字"
8、查看一级目录文件大小,取前三
du -h --max-depth=1 | sort -hr | head -n 3 展示隐藏的文件
du -sh * 不展示隐藏文件
du -sh * | sort -hr | head -n 3
-s:不展示子文件大小,只展示一级目录大小
-h:文件大小展示的可读性
9、压测,服务器的内存使用情况
free -h
10、压缩
解压:tar -xvf file
压缩:tar -cvf xx.tar file
11、grep
grep -n ‘关键字’ file 显示行号
grep -r '关键字' files 递归文件夹搜索关键字
grep -i '关键字' file 忽略大小写
grep -v '关键字' 反向查
12、内存方面
查看系统整体CPU占用情况(查看系统整体负载情况)
w
15:33:44 up 10 days, 7:24, 18 users, load average: 4.72, 3.16, 2.77
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.66.44 09:38 7:04 42:42m 0.00s tmux a -t wql3
load average:平均负载值,依次是1分钟cpu活动数、5分钟cpu活动数、15分钟cpu活动数
w这个命令与uptime 相似
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 522159360 2063216 15877368 0 0 0 10 0 0 2 1 97 0 0
io中的bi,读磁盘所占的CPU;bo,写磁盘所占的CPU
cpu中的wa,是I/O等待占用的内存
动态监控资源占用情况
top
Tasks: 2667 total, 8 running, 1796 sleeping, 0 stopped, 16 zombie(僵尸)
%Cpu(s): 4.1 us, 0.2 sy, 0.0 ni, 95.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 79118905+total, 51437747+free, 25886304+used, 17948536 buff/cache
KiB Swap: 23449596 total, 23449596 free, 0 used. 52883257+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
175832 kfin-st+ 20 0 1488616 420452 26228 S 68.6 0.1 5:56.89 celery
S:进程状态,S:interruptible sleep R:running D:uninterruptible sleep T:stoped Z:zombie
查询内存使用情况
free -g -t -s 5 (g是以G单位展示,t是汇总,s是秒,每5秒刷新一次)
total used free shared buff/cache available
Mem: 754 254 482 0 17 496
Swap: 22 0 22
Total: 776 254 505
iostat
(base) moli@Finance:~$ iostat
Linux 5.4.0-150-generic (Finance) 2024年12月24日 _x86_64_ (192 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.51 0.00 0.99 0.00 0.00 96.50
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
nvme0n1 16.59 3.63 280.25 4430710 342366388
sda 19.35 10.62 354.00 12971892 432464552
sdc 22.96 10.90 453.38 13320432 553870636
sdd 25.24 10.46 504.84 12777256 616738072
sdb 21.55 11.99 419.92 14648648 512998684
查看cpu 核数:lscpu\cpuinfo
磁盘方面
du :检查磁盘空间使用量
df:列出文件系统的整体磁盘使用量
3、sql
1、delete、truncate、drop 区别
delete 删除表内容,可以回滚
truncate 删除表内容,不可以回滚
drop 删除表结构 不可以回滚
2、mysql 的书写顺序
select * from tableA inner join tableB on tableA.id=tableB.id where id=12 group by name having id>2 order by id desc limit 2
3、mysql 的执行顺序
from on join where group by having select distict order by limit
4、测试用例
等价类、边界值、判定表
判定表的案例
测试case 设计万能公式
1、功能,状态迁移
2、界面UI
3、性能,分库分表
4、易用性
5、兼容性
6、弱网络
7、中断
8、安装卸载,版本号测试
接口测试(思路:功能、性能、安全、兼容、弱网)
功能:入参,出参:入参数据的合法性,包括,数据的类型,int,string;选填必填;文件数据的长度、大小、类型;分页;排序;入数据校验、出参的正确性校验
性能:响应时间、并发
安全:html、js、敏感信息加密、鉴权
异常:中断、弱网、数据库故障、幂等
兼容:新老数据兼容
其他:单接口、串联接口
优惠券
功能:满减、打折;扣减为0为负;使用前后结果校验;小数点;过期;叠加使用;使用顺序
性能:弱网、幂等
输入框
功能:点击输入框下拉加载默认数据,按时间倒序;搜索历史数据;模糊(前、中、后)、精确搜索;输入内容的最小最大字符限制;分页;排序;无效搜索:特殊字符;为空搜索
性能:响应时间
安全:js注入%%、鉴权
兼容:浏览器、分辨率的兼容
异常:中断、弱网、鉴权、数据库故障
5、性能指标
吞吐量:单位时间内处理的请求数量:衡量网络的
tps:每秒处理事物的能力:衡量服务器的
CPU利用率,小于80
响应时间
6、性能测试,服务器关注的点
1、cpu
top 实时查看cpu占用情况;
free -h -t 物理内存、交换内存使用情况
2、cpu负载
w、uptime 可以检测cpu每1分钟、5分钟、15分钟的平均负载
3、磁盘
df -h 磁盘空间使用情况
4、磁盘IO
- 磁盘读写速率、I/O 操作次数、磁盘利用率、平均队列长度、等待 I/O 的时间。
Iostat tps 每秒I/O 操作次数,每秒读多少kb,每秒写多少kb
iostat -dx 是IO分开的指标,每秒I操作次数,每秒O 操作次数;I的等待时间,O的等待时间;平均队列长度;磁盘利用率
大杂烩命令:vmstat
1、进程:r需要cpu运行的进程数;b被阻塞的进程数
2、内存:swpd 交换内存;free 物理内存;buff/cache 缓存
3、交换内存:si磁盘交换到内存的数量;so内存交换到磁盘的数量
4、io:读取与写入的数据块
5、system:in:每秒的中断数;cs:每秒的上下文切换次数
6、cpu:us:用户态 CPU 时间百分比;sy:系统态 CPU 时间百分比;id:空闲 CPU 时间百分比;wa:等待 I/O 的 CPU 时间百分比;st:被虚拟机偷走的 CPU 时间百分比
7、中间件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程