【Python与AI基础】Python编程基础:实现用户注册与校验
一、基础功能需求
1、版本一:
(1)综合使用当前所学知识,如列表、字典、字符串、函数等,实现一个基于命令行的用户注册功能。
(2)用户注册时必须要输入 用户名、密码、手机号码,用针对用户的输入必须进行验证。
(3)用户名的规则:只能是大小写字母或数字,且不能以数字开头,长度为5~12位。
(4)密码的规则:密码必须且只能由大小写和数字组成,长度为6~15位。
(5)手机号码的规则:按照标准的中国手机号码规则进行校验。
(6)如果校验成功,则允许用户注册,注册信息保存于列表或字典中,否则要求用户继续输入。
2、版本二:
(1)绘制菜单,用户可以自行决定下一步做什么:登录、注册、改密、改电话、退出。
(2)支持多用户注册,注册时,如果已经存在的用户名不能注册,使用列表+字典的数据结构完成。
(3)密码输入失败3次,则不再允许当前用户登录,退回到主菜单。
(4)用户登录成功以后,可以修改密码和电话号码,同样需要进行正确性校验。
3、版本三:
(1)将注册的用户名密码电话等信息,保存在文件文件中(CSV文件)。
(2)实现用户的登录功能,用于登录校验。
(3)在使用CSV保存用户数据的情况下,让用户可以修改密码(输入用户名、旧密码、新密码)
(4)用户在输入用户名、密码或电话时,如果输错超过3次,则结束运行。
4、版本四:
(1)利用MySQL数据库/JSON数据/XML等完成注册、登录、修改密码等操作(重构)
(2)记录用户操作的历史记录(登录、注册、改密、改电话)。
(3)合理利用目前已经学习的各类知识,将代码整理完善,形成优秀的代码结构。
二、实现思路
1、以什么的数据结构来保存用户信息?
列表:['zhangsan', 'Zhang123', '13812345678']
字典:{'username':'zhangsan', 'password':'Zhang123', 'phone':'13812345678'}
如果是针对多个用户呢?[{},{},{},{}] 列表中嵌入字典
2、有很多的校验,是否可以用函数进行管理?
check_username()
check_password()
check_phone()
input_user()
input_password()
input_phone()
do_reg()
3、有明确的提示信息,有明确的错误信息,代码的运行过程,如何提升用户体验。
三、代码实现
1、common.py公共函数模块
import re
'''
长度的判断5-12位,使用len函数进行判断
不能以数字开头:username[0]不能是0-9的范围
如何判断只能是大小写或数字:
返回值:True: 用户名正确, False: 用户名错误
'''
def check_username(username):
if len(username) < 5 or len(username) > 12:
return False
if username[0] >= '0' and username[0] <= '9':
# if not (username[0] < '0' or username[0] > '9'):
return False
for char in username:
if not (ord(char) in range(65, 91) or ord(char) in range(97, 123) or ord(char) in range (48, 58)):
return False
return True
'''
检查密码:由大写、小写和数字构成,且必须是6~15位
只要确保密码中至少有1位是大写,至少有1位是小写,至少有1位是数字
'''
def check_password(password):
if len(password) < 6 or len(password) > 12:
return False
lower = 0
upper = 0
digit = 0
for char in password:
if char >= 'A' and char <= 'Z':
upper += 1
elif char >= 'a' and char <= 'z':
lower += 1
elif char >= '0' and char <= '9':
digit += 1
if upper < 1 or lower < 1 or digit < 1:
return False
return True
# 检查电话号码
def check_phone(phone):
pattern = "^1[3-9]\d{9}$"
if re.match(pattern, phone):
return True
else:
return False
# 最基本最简单的单元测试代码:半自动化测试代码
# print(check_username('qiang'))
# print(check_username('132457'))
# print(check_username('Q132457'))
# 全自动的单元测试代码,编写一个测试驱动程序
def test_driver(func, expect, *args):
actual = func(*args)
if actual == expect:
print("测试 %s: 成功" % func.__name__)
else:
print("测试 %s: 失败" % func.__name__)
if __name__ == '__main__':
pass
# 测试用户名的规则
# test_driver(check_username, False, 'hi')
# test_driver(check_username, False, 'welcomeToWoniu123')
# test_driver(check_username, True, 'qiang')
# test_driver(check_username, False, '132457')
# test_driver(check_username, True, 'Q132457abc')
# test_driver(check_username, False, 'Q13#@%$bc')
# 测试密码的规则,TDD:Test-Driven Development
# test_driver(check_password, False, 'qiang')
# test_driver(check_password, False, 'welcomeToWoniu1231235')
# test_driver(check_password, False, 'WELCOME')
# test_driver(check_password, False, '12349234')
# test_driver(check_password, False, 'jojojoju1')
# test_driver(check_password, False, 'WILL12432')
# test_driver(check_password, True, 'Woniu123')
test_driver(check_phone, False, '1881234567')
test_driver(check_phone, False, '188123456799')
test_driver(check_phone, False, '988123456799')
test_driver(check_phone, False, '128123456799')
test_driver(check_phone, True, '13812345679')
2、version_01.py输入与注册代码
# from exercise.common import check_username, check_password, check_phone
from exercise.common import * # 可以一口气全部引用,但是不推荐
# username = ''
# password = ''
# phone = ''
def input_username():
# global username
username = input("请输入用户名:")
if check_username(username):
print("用户名正确.")
return username
else:
print("用户名错误.")
input_username() # 递归调用函数自身,完成循环的功能
def input_password():
# global password
password = input("请输入密码:")
if check_password(password):
print("密码正确.")
return password
else:
print("密码错误.")
input_password()
def input_phone():
# global phone
phone = input("请输入手机号:")
if check_phone(phone):
print("手机号正确.")
return phone
else:
print("手机号错误.")
input_phone()
def do_reg():
username = input_username()
password = input_password()
phone = input_phone()
user_list = []
user = {'username': username, 'password': password, 'phone': phone}
user_list.append(user)
print(user_list)
if __name__ == '__main__':
do_reg()