Python-random模块

一、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文件

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值