# 1. 学生管理,持久化存储
# 输入数字1,添加学生信息(id名字,年纪,性别)
# 第一个学生id为101 后续学生自动加1
# 输入数字2,查看所有学生信息
# 输入数字3,统计学生平均年纪
# 输入数字4,统计学生性别比例
# 输入数字0,退出系统
# 创建数据存储结构
datas = [{
"id": 101,
"name": "张三",
"age": 18,
"sex": "男"
}]
# 格式化菜单
menu = """输入数字1,添加学生信息(id名字,年纪,性别)
输入数字2,查看所有学生信息
输入数字3,统计学生平均年纪
输入数字4,统计学生性别比例
输入数字0,退出系统"""
# 使用常量存储路径防止书写错误
FILE_PATH = "./0722.txt"
# 保存
# 将数据保存为文件
def save_data():
with open(FILE_PATH, mode="w", encoding="utf8") as f:
# 使用json的dumps方法将数据序列化为字符串
content = json.dumps(datas)
# 将字符串写入文件
f.write(content)
# 读取
def load_data():
# 使用global声明datas为全局变量,
# 方便文件的数据传入datas
global datas
if os.path.exists(FILE_PATH):
with open(FILE_PATH, mode="r", encoding="utf8") as f:
# 使用json的load方法将文件(f)中的数据读取赋值给datas
datas = json.load(f)
# 规范用户在首页的选择
def legal_option():
while True:
option = input("请输入您要进行的操作:")
if option in [str(i) for i in range(5)]:
return option
else:
print("输入不合法,请重新输入")
# 规范用户输入的姓名
def legal_name():
while True:
name = input("请输入姓名:")
if 1 < len(name) < 5:
return name
else:
print("输入不合法,姓名长度应该在2-4")
# 规范用户输入的年龄
def legal_age():
while True:
age_str = input("请输入年纪:")
if age_str.isdigit() and 14 < int(age_str) < 25:
return int(age_str)
else:
print("年纪输入不合法,应该在15-24")
# 规范用户输入的性别
def legal_sex():
while True:
sex = input("请输入性别:")
if sex in ["男", "女"]:
return sex
else:
print("性别输入不合法,只能输入'男'或'女'")
# 规范用户对是否继续的选择
def legal_option_sub():
while True:
option_sub = input("是否继续Y/N")
if option_sub in ['Y', 'y', 'N', 'n']:
return option_sub
else:
print("输入不规范")
# 将添加学生封装成方法
def add_student():
while True:
datas.append({
"id": 101 if not datas else datas[-1]["id"] + 1,
"name": legal_name(),
"age": legal_age(),
"sex": legal_sex()
})
option_sub = legal_option_sub()
if option_sub == "N" or option_sub == "n":
break
# 将查看数据封装为方法
def show_all_student():
for item in datas:
print(f'id:{item["id"]},姓名:{item["name"]},年纪:{item["age"]},性别:{item["sex"]}')
# 将年龄的平均值计算封装为方法
def avg_age():
total = 0
for item in datas:
total += item["age"]
print(total / len(datas))
# 将性别比例的功能封装成方法
def sex_ratio():
if datas:
count = 0
for item in datas:
if item["sex"] == '男':
count += 1
print(f"男生比例{count / len(datas)},女生比例{1-count/len(datas)}")
else:
print("还没有录入学生")
# main方法,用于打包
def main():
while True:
load_data()
print(menu)
option = legal_option()
if option == "0":
# 退出系统
exit()
if option == "1":
add_student()
save_data()
if option == "2":
show_all_student()
if option == "3":
avg_age()
if option == "4":
sex_ratio()
option_sub = legal_option_sub()
if option_sub == "N" or option_sub == "n":
break
main()