# 随机生成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