alex学籍注册小程序学习

需求:
1.用户输入姓名,年龄,手机号,身份证号,所选课程,然后为学员完成注册。
2.手机号身份证号唯一
3.可选课程只能从python,linux,网络安全,前端,数据分析这几门课里选择
4.学员信息存入文件

今天第一次自己尝试编写,后续改进模块化,代码优化,最后参考课程讲的代码进行总结。

思路:
1.创建字典结构
dict{
    "序号":{"姓名":aaa,"年龄""111,"手机号":12345678,"身份证号":1234567890,"所选课程":python} 
}
  创建列表
list = ["python","linux","网络安全","前端","数据分析"]
  创建本地文件
f.write("stu_info","a")

2.循环现有的dict判断手机号是否等于value[2][2],若等于则退出当前循环,提示重复。
3.循环现有的dict判断身份证是否等于value[3][2],若等于则退出当前循环,提示重复。
4.判断输入的课程是否in课程列表,若是则判断有效。
5.循环存入文件。

info_dict = {}
class_list = ["python", "linux", "网络安全", "前端", "数据分析"]

count = 0
print("请进行学籍注册".center(50, '-'))
while True:
    f = open("stu_info", mode="a", encoding='UTF-8')  # 追加模式

    name = input("输入姓名:").strip()
    age = input("输入年龄:").strip()
    phone_num = input("输入手机号:").strip()
    id_card = input("输入身份证:").strip()
    classes = input("输入选择课程:").strip()

    if classes not in class_list:
        print("请重新输入课称")
        classes = input("输入选择课程:").strip()

    phone_num_error_time = 0
    id_card_error_time = 0
    for cnt, info_values in info_dict.items():
        if int(info_values["手机号"]) == int(phone_num):
            print("手机号重复,请重新输入")
            phone_num = input("输入手机号:").strip()
            if phone_num_error_time > 5:
                exit("手机号重复次数超过5次,请重新注册..")
            phone_num_error_time += 1
        if int(info_values["身份证号"]) == int(id_card):
            print("身份证号重复,请重新输入")
            id_card = input("输入身份证:").strip()
            if id_card_error_time > 5:
                exit("身份证号重复次数超过5次,请重新注册..")
            id_card_error_time += 1

    info_dict[f"{count}"] = {
        "姓名": name,
        "年龄": age,
        "手机号": phone_num,
        "身份证号": id_card,
        "所选课程": classes
    }
    # # 第一种写入方式,不太好有bug
    # f.write(str(f"第{count}位学员").center(50, '-') + '\n')
    # for key, val in info_dict[f"{count}"].items():
    #     info_str = key + ':' + val + '\n'
    #     f.write(info_str)

    # 第二种写入方式 横排写入
    info_str = f"{name},{age},{phone_num},{id_card},{classes}\n"
    f.write(info_str)
    f.close()
    print("信息已存入本地文件")
    count += 1

第一次总结:大体需求可以实现,但函数模块化,逻辑优化,功能优化,bug还需要修改,改进后继续更新。

今晚听的歌曲是哥哥的《共同渡过》,他活在我们的心中,分开也像共同渡过。


更新:第一阶段课程代码,函数模块化之后的样子

db_file = "student_data.db"


def register_api():
    stu_data = {}  # 为了存学员信息,初始化字典
    print("欢迎来到路飞学程".center(50, '-'))
    print("请完成学籍注册")
    name = input("姓名:").strip()
    age = input("年龄:").strip()
    phone_num = input("手机号:").strip()
    id_card = input("身份证:").strip()
    course_list = ['python开发', 'linux云计算', '网络安全', '数据分析&机器学习', '前端开发']
    for index, course in enumerate(course_list):
        print(f"{index}.{course}")
    selected_course = input("想学习的课:")

    if selected_course.isdigit():
        selected_course = int(selected_course)
        if selected_course >= 0 and selected_course < len(course_list):
            picked_course = course_list[selected_course]  # 选中的课程
        else:
            exit("不合法的选项。。")
    else:
        exit("非法输入。。")
    stu_data['name'] = name
    stu_data['age'] = age
    stu_data['phone'] = phone_num
    stu_data['id_num'] = id_card
    stu_data['course'] = picked_course
    return stu_data


def commit_to_db(filename, stu_data):
    """
    把学员数据存到数据库里
    :param filename:学员数据库文件
    :param stu_data:单个学员的数据
    :return:
    """
    f = open(filename, "a", encoding='UTF-8')
    row = f"{stu_data['name']},{stu_data['age']},{stu_data['phone']},{stu_data['id_num']},{stu_data['course']}\n"
    f.write(row)
    f.close()


student_data = register_api()
print(student_data)
commit_to_db(db_file, student_data)

唯一性验证的问题待更新


更新唯一性验证和手机号合法性验证

def register_api():
    """
    学籍注册函数
    :return:
    """
    stu_data = {}  # 为了存学员信息,初始化字典
    print("欢迎来到路飞学程".center(50, '-'))
    print("请完成学籍注册")
    name = input("姓名:").strip()
    age = input("年龄:").strip()
    phone_num = input("手机号:").strip()
    if phone_num in phone_list:
        exit("手机号重复.")
    valid_phone_num(phone_num)
    id_card = input("身份证:").strip()
    if id_card in id_card_list:
        exit("身份证号重复.")

    course_list = ['python开发', 'linux云计算', '网络安全', '数据分析&机器学习', '前端开发']
    for index, course in enumerate(course_list):
        print(f"{index}.{course}")
    selected_course = input("想学习的课:")

    if selected_course.isdigit():
        selected_course = int(selected_course)
        if 0 <= selected_course < len(course_list):
            picked_course = course_list[selected_course]  # 选中的课程
        else:
            exit("不合法的选项。。")
    else:
        exit("非法输入。。")
    stu_data['name'] = name
    stu_data['age'] = age
    stu_data['phone'] = phone_num
    stu_data['id_num'] = id_card
    stu_data['course'] = picked_course
    return stu_data


def commit_to_db(filename, stu_data):
    """
    把学员数据存到数据库里
    :param filename:学员数据库文件
    :param stu_data:单个学员的数据
    :return:
    """
    f = open(filename, "a", encoding='UTF-8')
    row = f"{stu_data['name']},{stu_data['age']},{stu_data['phone']},{stu_data['id_num']},{stu_data['course']}\n"
    f.write(row)
    f.close()


def load_valid_data(filename):
    """
    把注册文件加载到内存,保存手机号和身份证号为两个列表
    供用户输入时查询是否有重复
    :param filename:文件名
    :return:phone和idcard的列表
    """
    f = open(filename, encoding='UTF-8')
    phone_list = []
    id_card_list = []
    for line in f:
        line = line.split(',')
        phone = line[2]
        id_card = line[3]
        phone_list.append(phone)
        id_card_list.append(id_card)
    return phone_list, id_card_list


def valid_phone_num(num):
    """
    验证手机号是不是数字是不是11位
    :param num: 手机号
    :return:
    """
    if not num.isdigit():
        exit("手机号必须是数字.")
    if len(num) != 11:
        exit("手机号必须是11位.")


if __name__ == '__main__':
    db_file = "student_data.db"

    phone_list, id_card_list = load_valid_data(db_file)

    student_data = register_api()

    commit_to_db(db_file, student_data)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值