当前位置: 首页 > 后端技术 > Python

Python内置库itertools生成穷举词典

时间:2023-03-26 14:13:47 Python

后台,用于测试活动页面的接口参数是否穷举。要求生成一个由0123456789ABCDEF组成的固定数字字符串,并枚举出所有可能的结果。循环嵌套的思路优点:简单易懂缺点:需要多少位就需要多少循环嵌套,比较麻烦,占用内存。导入第三方工具生成的词典。优点:直接使用,不用随时生成。缺点:需要第三方工具生成,导入后会占用内存。最后的解决方案是Python自带的itertools迭代器,可以直接生成需要的字典。优点:高效,节省内存(所谓“惰性计算”就是在字符循环的时候计算字符,不会提前计算所有数据存入内存。)缺点:其实我只知道howmanyfunctionsofitertools一个可能有用的方法itertools.accumulate(iterable[,func])默认返回一个累加序列,设置func可以返回累加乘法等计算。importitertoolsdata=[1,2,3,4]a=itertools.accumulate(data)foraaina:print(aa)output13610itertools.chain(*iterables)当iterables需要连续遍历多个序列时可以使用这个.a=[1,2,3]b=[4,5,6]c=itertools.chain(a,b)print(list(c))输出[1,2,3,4,5,6]itertools.combinations(*iterable,r*)是数学中的组合数,数学符号$C_m^n$,其中m是传入序列的元素个数,n是传入的第二个参数c=itertools.combinations('ABC',2)print(list(c))输出[('A','B'),('A','C'),('B','C')]itertools。permutations(iterable,r)是数学中的排列数,数学符号$A_m^n$,其中m是传入序列的元素个数,n是传入的第二个参数。c=itertools.permutations('ABC',3)print(list(c))输出[('A','B','C'),('A','C','B'),('B','A','C'),('B','C','A'),('C','A','B'),('C','B','A')]itertools.product(iterable,repeat=1)这次使用的方法。可以生成穷举序列,第一个参数是序列的组成元素,第四和第二个参数repeat=2表示穷举两位。c=itertools.product('123',repeat=2)#print(list(c))foriinc:print(''.join(i))输出111213212223313233结尾c=itertools.product('0123456789ABCDEF',repeat=8)#print(list(c))foriinc:print(''.join(i))这可以生成一个8位的详尽字典。0123456789ABCDEF组成的8位穷举字典一共有$16^8$,即4294967296,接近43亿。所以,8位想成功几乎是不可能的。虽然成功生成了详尽字典,但目标参数是64位。如果穷举列表穷尽,则需要1.158E+77次。