乐趣区

关于python:Python内置库itertools生成穷举字典

背景

测试某流动页面接口参数是否可穷举。

需要

生成一个由 0123456789ABCDEF 组成的、固定位数的字符串,并穷举所有可能的后果。

思路

  1. for 循环嵌套
  2. 长处:好了解
  3. 毛病:要多少位就须要多少个循环嵌套,麻烦,且占内存。
  4. 导入第三方工具生成的字典
  5. 长处:间接应用,不必随时生成
  6. 毛病:须要第三方工具生成,且导入之后占内存

最终计划

Python 自带的 itertools 迭代器,能够间接生成所需字典。

  • 长处:高效、省内存(所谓“惰性计算”,就是在循环到某一字符的时候才计算到该字符,不会提前计算完所有数据存储在内存中。)
  • 毛病:我竟然才晓得

    itertools 的几个可能有用的办法

  • itertools.accumulate(iterable [, func])
    默认返回一个累加序列,设定 func 能够返回累乘等其余计算。

    import itertools
    
    data = [1, 2, 3, 4]
    a = itertools.accumulate(data)
    for aa in a:
      print(aa)

    输入

    1
    3
    6
    10
  • 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))

    输入

    11
    12
    13
    21
    22
    23
    31
    32
    33

    终局

    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 次。

退出移动版