python 生成器
python 生成器,这里是指包含 yield关键字的函数,区别于类似表达式的那种情况,例如:
generator = (x*5+6 for x in range(20))
本文主要探讨 生成器函数(如下代码)在字典生成的应用。
def counts(n):
i=0
while i < n:
yield i
i +=1
关于字典
生成字典的函数,需要的必要参数:
1、组成字典的元素,可以自定义,例如一个字符(数字1-9,字母a-zA-z,符号@#$%^*&等)或者一个字符组合。
2、单一 一条字典数据中,包含的元素的个数,可以指定个数,1-n的数字,只要硬盘容量足够,可以任意长度。
组合结果由元素个数决定(元素个数的指数n**n,例如3个元素产生3 ** 3=27条数据),而不是字符个数。
字典生成代码
首先定义字典元素:
ele = list('abcdefg123456*#@')
或者通过自定义文件(文件名 dicts.txt,每个元素占一行)加载:
with open('dicts.txt') as f:
ele = f.readlines()
然后设置 字典单条数据中包含元素的个数:
n=5
或者在命令行输入:
import sys
n=int(sys.argv[1])
下面看重点的生成器函数:
def t1(n, ele):
a, c = ele, ele
for x in range(n):
yield iter(a)
c = (i+j for i in ele for j in a)
a = list(c)
函数中使用了生成器表达式 (i+j for i in ele for j in c),它实现了类似下面的循环嵌套:
for i in list1:
for j in list2:
...
理论上,可以进行无限循环嵌套。
在调用上面的生成器函数时,返回的(除第一次外)也是生成器,分别对应的是选择所有元素中的2个、3个、4个 … n个元素时产生的字典生成器,可以根据需要选择 所有元素长度的的字典,或是 某一个元素长度的字典,下面实例调用的是最后一个生成器,即元素个数为n时生成的字典。
def main(n=5):
tmp = t1(n, ele)
x2=[]
for i in tmp:
x2 = i
print(type(x2))
#for j in x2:
#print(j)
with open('results.txt','w') as f:
for i in x2:
f.write('{}\n'.format(i))
上面的变量 x2 即为 函数输出的最后一个生成器,如果 n=5,x2是由5个元素组成的字典生成器,字典最后保存在results.txt文件中。
总结
通过python的生成器函数,可以输出 长度 和 组成元素 可 任意指定的字典,在 对登录页面 和 加密文件 爆破时,可以方便使用。