Python 自定义模块 —— 随机生成6位验证码(不重复)

# 随机生成6位验证码

"""
思考:
    0、如何自定义模块
    1、需要导入自己写的模块?
    2、怎么才能防止验证发不重复?
    3、用什么模块才能产生随机数?
    4、如何制作自己的模块包

介绍:
    很多网站的注册登录业务都加入了验证码技术,以区分用户是人还是计算机,有效地防止了
    刷票、论坛灌水、AI水军、恶意注册等行为。
    目前验证码的种类大致由大写字母、小写字母、数字组成。

知识点:
    1、自定义模块
    2、类与对象的应用:类的定义、函数的封装,类对象的创建
    3、导入自己写模块,导入随机模块(random)
    4、调用模块里的类、函数、变量

不足(待改善):
    1、Produce类的duth_code()传参不是很人性化,对基础较弱的伙伴很不友好,
    参数:option=‘num or letter’,表示要传入字符串‘num’或者‘letter’,
    否则传入默认值,但就是不能传入字符串‘num’或者‘letter’意外的字符串,否则会报错。
    2、不能数字和大写字母组合,不能数字和小写字母组合成验证码,有待改进。

"""


# 导入自己写的模块
import my_module

# 创建类的对象
my_object = my_module.Produce

# 打印6位(数字+大小写字母)验证码
print('6位数字和字母验证码:{}' .format(my_object.auth_code()))

# 打印8位(数字+大小写字母)验证码
print('8位数字和字母验证码:{0}'.format(my_object.auth_code(num=8)))

# 打印6位(数字)验证码
print('6位数字验证码:{num}'.format(num=my_object.auth_code('num')))

# 打印10位(大小写字母)验证码
print(f'10位字母验证码:{my_object.auth_code(option="letter", num=10)}')



自定义模块:my_module.py



# 随机产生(数字、字母)模块
class Produce:

    # 定义一个空列表,是随机数来源的容器
    __rand_num = list()

    # 定义一个空集合,用于存储已经产生的验证码,(也可以用空列表)
    __abandon = set()

    # 验证码容器
    @classmethod
    def __vessel(cls, option='num or letter'):

        # 清空列表,(随机数来源的容器)
        cls.__rand_num = list()

        if option == 'num':
            # 把数字存入列表
            for i in range(10):
                cls.__rand_num.append(str(i))

        elif option == 'letter':
            # 把大小写字母存入列表
            for i in range(26):
                cls.__rand_num.append(chr(i + 65))  # 大写字母
                cls.__rand_num.append(chr(i + 97))  # 小写字母

        elif option == 'num or letter':
            # 把数字存入列表
            for i in range(10):
                cls.__rand_num.append(str(i))

            # 把大小写字母存入列表
            for i in range(26):
                cls.__rand_num.append(chr(i + 65))  # 大写字母
                cls.__rand_num.append(chr(i + 97))  # 小写字母

        else:
            print('参数option传递错误!!!')
            print("option='num' or 'letter'")

            import sys
            sys.exit()


    # 随机生成6位验证码
    @classmethod
    def auth_code(cls, option='num or letter', num=6):

        buf = ''                        # 定义一个空的字符串,用于存储6位验证码

        cls.__vessel(option=option)                  # 验证码容器

        from random import choice       # 导入随机模块

        for i in range(num):
            buf += choice(cls.__rand_num)     # 随机数拼接成6位验证码

        # 如果废弃站集合为空
        if cls.__abandon == set():
            cls.__abandon.add(buf)  # 把验证码存入废弃站集合,说明此验证码不能再使用
            return buf

        # 保证6位验证码不重复
        for i in cls.__abandon:

            # 如果验证码重复
            if buf == i:
                buf = cls.auth_code(option=option, num=num)
                return buf

        # 验证码不重复
        cls.__abandon.add(buf)     # 把验证码存入废弃站集合,说明此验证码不能再使用
        return buf

    # 查看数据
    @classmethod
    def check_data(cls):
        print(f'随机数库:{cls.__rand_num}')
        print('废弃站:{}' .format(cls.__abandon))

    # 清空废弃站
    @classmethod
    def clear_abandon(cls):
        cls.__abandon.clear()


# 程序测试
if __name__ == '__main__':

    print(Produce.auth_code())
    print(Produce.auth_code(num=8))
    print(Produce.auth_code(option='num'))
    print(Produce.auth_code(option='letter', num=10))


运行结果:

 作者:周华

创作日期:2022/6/14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值