背景
测试某流动页面接口参数是否可穷举。
需要
生成一个由0123456789ABCDEF组成的、固定位数的字符串,并穷举所有可能的后果。
思路
- for循环嵌套
- 长处:好了解
- 毛病:要多少位就须要多少个循环嵌套,麻烦,且占内存。
- 导入第三方工具生成的字典
- 长处:间接应用,不必随时生成
- 毛病:须要第三方工具生成,且导入之后占内存
最终计划
Python自带的itertools迭代器,能够间接生成所需字典。
- 长处:高效、省内存(所谓“惰性计算”,就是在循环到某一字符的时候才计算到该字符,不会提前计算完所有数据存储在内存中。)
毛病:我竟然才晓得
itertools的几个可能有用的办法
itertools.accumulate(iterable [, func])
默认返回一个累加序列,设定func能够返回累乘等其余计算。import itertoolsdata = [1, 2, 3, 4]a = itertools.accumulate(data)for aa in a: print(aa)
输入
13610
itertools.chain(*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))for i in c: print(''.join(i))
输入
111213212223313233
终局
c = itertools.product('0123456789ABCDEF', repeat=8)# print(list(c))for i in c: print(''.join(i))
由此能够生成8位穷举字典。
由0123456789ABCDEF组成的8位穷举字典共有$16^8$个,也就是4294967296,靠近43亿。所以8位简直没有可能胜利了
尽管胜利生成穷举字典,然而指标参数是64位的,要是穷举完,须要1.158E+77次。