作为新手,当我们把程序的各个部分学完之后,总想做个什么东西出来,来检验自己所学。那么如何对各个知识块进行串联起来并加以综合运用就是我们面临的第一个问题,作为勇哥,也是过来人,在这给大家准备了一个比较简单的练手小项目,项目虽然有点low,但是我把不少基础的东西都融进去,通过这个小项目,目的是锻炼和加深大家对基础的理解。
考虑到是新手,这里给准备了一个使用纯函数实现的一个学生成绩管理系统。后续会对该代码进行升级。后边的视频会解读这个项目代码,喜欢的话,请关注 “码农阿勇”,后边我们还会陆续推出一些python练手项目,欢迎大家关注和转发。
项目程序主要功能如下 (项目代码量160行,封装10个函数):
学生成绩录入
班级总成绩统计
显示各课的平均成绩
输入科目,打印该科目班级的前三名
统计每个学生的总成绩
数据持久化保存
清空班级所有成绩数据
退出
项目涉及到的知识点有:列表,字典,字符串,程序结构,函数,json和os模块的使用以及文件操作等。
###########代码如下###########################
import os #包含处理文件路径的一些函数
import json
dt={}# 成绩数据结构为:{name:[语文,数学,英语]}
def get_save_path():
"""设置文件路径"""
curdir = __file__
temp = os.path.dirname(os.path.split(curdir)[0])
temp = os.path.dirname(temp)
temp = temp.replace("/", "\\\\")
file_path = os.path.join(temp, "my_score.txt")
with open(file_path,"a") as f:
pass
return file_path
def check_input(arg,flag):
""" 检测录入的用户名和成绩"""
arg=arg.strip()
if flag==1:#检测姓名
if arg.isalpha():
return True
else:
print("你输入的数据类型不合法")
return False
else:#检测成绩
if arg.isdigit():
if int(arg)<=150 and int(arg)>=0:
return True
else:
print("输入的成绩无效!")
return False
else:
print("成绩输入数据不合法")
return False
def read_file():#读取文件的内容和缓存进行合并处理
"""负责从文件读取数据"""
with open(get_save_path(),"r",encoding="utf-8") as f:
temp=f.read()
if temp :#读出的数据不为空,则装载还原
data=json.loads(temp)
dt.update(data)
#print(dt,"文件中读取的内容")
return dt
def clear_file():
"""清空文件内容"""
with open(get_save_path(), "w", encoding="utf-8") as f:
print("数据清除成功!!!!")
def input_score():
"""成绩录入并实现写人文件"""
name=input("请输入学生姓名:")
while not check_input(name,1):
name = input("请输入学生姓名:")
yw=input("语文:")
while not check_input(yw,0):
yw = input("请输入语文:")
sx=input("数学:")
while not check_input(sx, 0):
sx = input("请输入数学:")
yy=input("英语:")
while not check_input(yy, 0):
yy = input("请输入英语:")
data = read_file() #
if name not in data.keys():
dt[name] = [int(yw), int(sx), int(yy)]
print('输出录入缓存成功')
data = json.dumps(data) # 对合并后的数据进行组合
with open(get_save_path(), "w", encoding="utf-8") as f:
f.write(data)
print(dt)
print("成功写入文件!!!")
else:
print("名称重复,请重新输入")
def get_all_sum():
"""求班级的总成绩和"""
data=read_file()
sum1=0
for i in data.values():#此处的i代表一个学生成绩的列表
for j in i:
sum1=sum1+j
return sum1
def get_avg_score():
"""按课程名称求平均值"""
dt1={}
dt1["语文平均"]=0
dt1["数学平均"] = 0
dt1["英语平均"] = 0
data = read_file()
if data:
num=len(data)
for i in data.values():
dt1["语文平均"]=dt1["语文平均"]+i[0]
dt1["数学平均"] = dt1["数学平均"] +i[1]
dt1["英语平均"] = dt1["英语平均"] +i[2]
dt1["语文平均"] = dt1["语文平均"]//num
dt1["数学平均"] = dt1["数学平均"]//num
dt1["英语平均"] = dt1["英语平均"]//num
return dt1
def pre_three_stu(k_name):
"""根据指定的课程名称,进行排前三名"""
data = read_file()
p=["语文","数学","英语"]
if data and k_name in p:
if k_name=="语文":
print(sorted(data.items(),
key=lambda x:x[1][0],reverse=True)[:3])
if k_name=="数学":
print(sorted(data.items(),
key=lambda x:x[1][1],reverse=True)[:3])
if k_name=="英语":
print(sorted(data.items(),
key=lambda x:x[1][2],reverse=True)[:3])
else:
print("文件内容为空或输入的字符错误!")
def get_stu_score_sum():
"""以字典形式返回每个学生的成绩总和"""
data = read_file()
dt2={}
for i in data.keys():
sum1=0
for j in data[i]:
sum1=sum1+j
dt2[i]=sum1
return dt2
def main():
print("-----码农阿勇成绩管理系统----")
while True:
opt=input("1-----录入成绩\n"
"2-----获取班级总成绩\n"
"3-----各科成绩平均值\n"
"4-----打印前三名\n"
"5-----获取每个学生的成绩和\n"
"6-----清除文件所有成绩\n"
"7-----退出系统\n") #菜单显示
if opt!="" and opt.isdigit():
if opt=="1":
input_score()
elif opt=="2":
print(get_all_sum())
elif opt=="3":
print(get_avg_score())
elif opt=="4":
name=input("请输入科目名称:")
pre_three_stu(name)
elif opt=="5":
print(get_stu_score_sum())
elif opt=="6":
clear_file()
else :
print("系统退出成功!")
break
main() #程序主函数
联系客服