【Python与AI基础】Python编程基础:实现用户注册与校验

65 阅读4分钟

【Python与AI基础】Python编程基础:实现用户注册与校验

www.bilibili.com/video/BV1oe…

一、基础功能需求

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()