一、random模块的用法
import random print(random.random()) # 不需要传参,random 返回0-1随机小数 print(random.uniform(1, 10)) # 需要传参,返回参数区间的随机小数 print(random.randint(-100, 100)) # 需要传参,返回参数区间的随机整数 print(random.randrange(1, 2)) # 类似与uniform,这个是左闭右开区间 print(random.choice(['孙悟空', 18, ('吃饭', '睡觉', '打豆豆')])) # 从一个序列中随机选择一个元素;序列可以是 字符串,列表,字典,元组 print(random.sample(['孙悟空', 18, ('吃饭', '睡觉', '打豆豆')], 2)) # 与choice相似,区别,可以取多个值(根据参数决定),返回列表 l = [1, 3, 5, 7, 9] random.shuffle(l) # shuffle,洗牌,把容器(可变类型 = 列表 )中的数据打乱顺序 print(l)
运行结果:
0.7875324724376389
9.009184861681847
19
1
孙悟空
[18, ('吃饭', '睡觉', '打豆豆')]
[7, 3, 5, 9, 1]
二、random模块实际运用
1、随机生成一个16位密码;必须包含大写字母,小写字母,数字和符号,如:vC3D-kf26c+70(z4。
(1)思路
1) 新建一个空字符串
2)16位密码,循环16次,每次随机从大写字母,小写字母,数字和符号中随机选一个 #
3)然后将16个字符拼接起来
(2)代码的思路
pwd = ''
for i in range(16): # 不需要i ,只是单纯循环16次,可将i替换为_
随机字符 = random.choice([['大写字母','a','b'], ['小写字母'], ['数字'], ['符号']])
# 这里列举写字母,数字,符号太麻烦,可以用ASCII码,规定不同的范围
pwd += 随机字符
(3)初步简略代码
def pwd_generator(length):
pwd = ''
list = [[97, 122], [65, 90], [48, 57], [33, 47]]
# 小写字母:97-122,大写字母:65-90 ,数字:48-57,符号33-47;
# print(random.choice(list))
for _ in range(length):
random_list = random.choice(list) # 选择的是4个子列表中的任意一个
random.randint(random_list[0], random_list[1]) # 返回参数区间的任意整数
random_char = chr(random.randint(*random_list)) # *用在实参中是打散,形参中打包
pwd += random_char
return pwd
print(pwd_generator(16))
运行结果:
1P06Osl28CKzy$q%
注:实际运用中,以下代码二选一即可,(功能一样,不同的表达)
random.randint(random_list[0], random_list[1])
random_char = chr(random.randint(*random_list))
# 上述代码,多次运行可能发现,只有三种字符或者两种字符(we42lz),对上述问题进行解决;
(4)完整代码之一
def pwd_generator(length):
if length < 4: # 若密码长度小于4 ,无法满足必须包含4种字符,返回空字符串
return ''
while True:
pwd = ''
for _ in range(length):
list = [[97, 122], [65, 90], [48, 57], [33, 47]]
# 小写字母:97-122,大写字母:65-90 ,数字:48-57,符号33-47;
# print(random.choice(list))
random_list = random.choice(list) # 选择的是4个子列表中的任意一个
random_char = chr(random.randint(*random_list)) # *用在实参中是打散,形参中打包
pwd += random_char
l = [False for i in range(4)] # 通过列表创建4个值都为False的列表
# 遍历前面生成的密码 pwd ,判断密码是否包含四种类型的字符
# 因为可能16次循环完,碰巧出现少某一种或多种字符
for word in pwd :
if 97 <= ord(word) <= 122:
l[0] = True
if 65 <= ord(word) <= 90:
l[1] = True
if 48 <= ord(word) <= 57:
l[2] = True
if 33 <= ord(word) <= 47:
l[3] = True
if l[0] and l[1] and l[2] and l[3]:
return pwd
print('密码不合法',pwd)
# 以上整体放入一个死循环中,知道有合法的密码,才会return出去
print(pwd_generator(6))
运行结果:
密码不合法 Yy012j
密码不合法 (*awKP
密码不合法 0977hi
密码不合法 #g#Ge&
密码不合法 22,3W1
.%ssR0
符:ASCII码
(5)第二种方法思路:
1)将随机生成的4中字符都要;
2)循环16/4次;
3)循环结束后,洗牌,再转成字符串返回去
def pwd_generator(length):
pwd = []
for _ in range(length//4+1): # 在这里加1 ,若需要长度是5,5不是4的倍数,需要循环两次,得到8个字符
char_list = [chr(random.randint(97, 122)),
chr(random.randint(65, 90)),
chr(random.randint(48, 57)),
chr(random.randint(33, 47))]
pwd.extend(char_list)
pwd = pwd[:length] # 这里切片,比如需要5个字符,两次循环,得到8个字符
random.shuffle(pwd)
return ''.join(pwd) # 转成字符串返回
print(pwd_generator(8))
# 如上的方法,得到的密码,每种字符有两位
运行结果;
*jN,V6q3
附:
(1)切片:从 python 对象中提取出部分值。
python 切片操作可以使用切片操作符 : 和切片类 slice 来完成
list[:stop]
(2)str.join(item),join函数是一个字符串操作函数
str表示字符串(字符),item表示一个成员,注意括号里必须只能有一个成员
例:','.join('abc')
“将字符串abc中的每个成员以字符 ',' 分隔开再拼接成一个字符串
输出结果:'a,b,c'
三、ASCII码表
请看PDF文件