要求:
1、写个装饰器计算每个操作的时间
2、登录、注册操作
3、读文件的时候有个迭代器
4、 加个生成器和协程
5、面向对象
代码如下:
import csv
import pandas as pd
from pandas.core.frame import DataFrame
import time
import random
class StudentT(object):
def __init__(self):
self.student_list=[]
def read_file(self):#读文件
frame=[]
with open('学生成绩.csv','r',encoding='utf-8') as f:
readers = csv.reader(f)
while True:
try:
frame.append(readers.__next__())
except StopIteration:
break
data=pd.DataFrame(frame)
data.columns=['姓名','性别','学号','年龄','语文','数学','英语','总分','平均分','方差','排名']
return data
def sort(self,data): #排序
data['总分']=pd.to_numeric(data['总分'],errors='coerce') #float
data_new=data[:len(data)-1].sort_values(by=['总分'],ascending=False)
sort=[]
a=range(len(data_new))
b=iter(a)
while True:
try:
sort.append((b.__next__())+1)
except StopIteration:
break #迭代器
data_new['排名']=sort
return data_new
@staticmethod #静态方法
def xianshi():
print("---------------------------")
print(" 学生管理系统登陆 ")
print(" ")
print(" 1:登 录 ")
print(" 2:注 册 ")
print(" 3:退 出 ")
print(" 4:修改密码 ")
print(" ")
print("---------------------------")
@staticmethod
def jiemian():
print("---------------------------")
print(" 学生成绩管理系统 1.0")
print(" 身份 : 管理员")
print(" ")
print(" 1:添加学生" )
print(" 2:删除学生" )
print(" 3:修改学生" )
print(" 4:查询学生" )
print(" 5:显示所有学生" )
print(" 6:退出系统" )
print(" ")
print("---------------------------")
@staticmethod
def jiemian2():
print("---------------------------")
print(" 学生管理系统 1.0")
print(" 身份 :学生 ")
print(" ")
print(" 1:查询学生" )
print(" 2:显示所有学生" )
print(" 3:退出系统" )
print(" ")
print("---------------------------")
#添加学生
def add(self):
name=input("请输入学生姓名:")
gender=input("请输入学生性别:")
num=input("请输入学生学号:")
age=input("请输入学生年龄:")
language=input("请输入学生语文成绩:")
math=input("请输入学生数学成绩:")
english =input("请输入学生英语成绩:")
total=float(language)+float(math)+float(english)
average=total/3
variance=((float(language)-float(average))**2+(float(math)-float(average))**2+(float(english)-float(average))**2)/3
datas=self.read_file()
self.student_list=[name,gender,num,age,language,math,english,total,average,variance, 1]
datas2=self.sort(datas)
datas2.loc[len(datas2)]=self.student_list
datas2.loc[len(datas2)]=['平均分','None','None','None','None','None','None','None','None','None','None']
print("添加成功!")
self.save_file(datas2)
#删除
def remove(self):
name_del=input("请输入想要删除的学生姓名:")
datas=self.read_file()
if name_del in list(datas['姓名']):
datas2=datas[~datas['姓名'].isin([name_del])]
datas2.reset_index(inplace=True,drop=True)
print()
print("删除%s信息成功!" % name_del)
print()
self.save_file(datas2)
else:
print("没有该同学!!!")
#修改
def new_input(self,content,message):
self.input_str=input(message)
if len(self.input_str)>0:
return self.input_str
else:
return content[0]
def xiugai(self,data_1):
name1=self.new_input(list(data_1["姓名"]),"请输入修改后的学生姓名[回车不修改]:")
gender1=self.new_input(list(data_1["性别"]),"请输入修改后的学生性别[回车不修改]:")
num1=self.new_input(list(data_1["学号"]),"请输入修改后的学生学号[回车不修改]:")
age1=self.new_input(list(data_1["年龄"]),"请输入修改后的学生年龄[回车不修改]:")
language1=self.new_input(list(data_1["语文"]),"请输入修改后的学生语文成绩[回车不修改]:")
math1=self.new_input(list(data_1["数学"]),"请输入修改后的学生数学成绩[回车不修改]:")
english1=self.new_input(list(data_1["英语"]),"请输入修改后的学生英语成绩[回车不修改]:")
total1=float(language1)+float(math1)+float(english1)
average1=total1/3
variance1=((float(language1)-float(average1))**2+(float(math1)-float(average1))**2+(float(english1)-float(average1))**2)/3
self.student_list=[name1,gender1,num1,age1,language1,math1,english1,total1,average1,variance1, 1]
return self.student_list
def modification(self):
datas=self.read_file()
name2=input("请输入想要修改的学生姓名:")
if name2 in list(datas["姓名"]):
data_1=datas.loc[datas['姓名'].str.contains(name2)]
datas2=datas[~datas['姓名'].isin([name2])]
datas2.reset_index(inplace=True,drop=True)
datas3=self.sort(datas2)
datas3.loc[len(datas3)]=self.xiugai(data_1)
datas3.loc[len(datas3)]=['平均分','None','None','None','None','None','None','None','None','None','None']
print()
print("修改成功!")
print()
datas3=self.save_file(datas3)
else:
print()
print("您输入的学生姓名错误,请重新输入")
print()
#查找学生
def find(self):
datas=self.read_file()
find_name=input("请输入你要查找的学生姓名:")
if find_name in list(datas['姓名']):
data_1=datas.loc[datas['姓名'].str.contains(find_name)]
print(data_1)
else:
print("查无此人")
#显示所有学生信息
def showall(self):
try:
datas=self.read_file()
print(datas)
except:
print()
print("显示失败!")
print()
#成绩处理
def count(self,datas):
datas2=self.sort(datas)
datas2['语文']=pd.to_numeric(datas2['语文'],errors='coerce')
datas2['数学']=pd.to_numeric(datas2['数学'],errors='coerce')
datas2['英语']=pd.to_numeric(datas2['英语'],errors='coerce')
datas2['总分']=pd.to_numeric(datas2['总分'],errors='coerce')
datas2.loc[len(datas2)]=['平均分','None','None','None','None','None','None','None','None','None','None']
datas2.loc[len(datas2)-1,'语文']=datas2['语文'][:len(datas2)-1].mean()
datas2.loc[len(datas2)-1,'数学']=datas2['数学'][:len(datas2)-1].mean()
datas2.loc[len(datas2)-1,'英语']=datas2['英语'][:len(datas2)-1].mean()
datas2.loc[len(datas2)-1,'总分']=datas2['总分'][:len(datas2)-1].mean()
return datas2
#保存数据至文件中
def save_file(self,data):
datas=self.count(data)
outputpath='c:/Users/gby/python/.vscode/学生成绩.csv'
datas.to_csv(outputpath,sep=',',index=False,header=False)
print("数据保存成功!")
class Student(StudentT):
def __init__(self):
self.users={'user':'gby','pwd':'123456'}
self.user2=[]
self.user2.append(self.users)
StudentT.__init__(self)
#登录
def denglu(self):
user1 = input("请输入用户名:")
pwd1=input("请输入密码:")
users=iter(self.user2) #迭代器
while True:
try:
a=next(users)
if user1 =='gby' and pwd1 =='123456':
self.teachers()
elif user1 ==a['user'] and pwd1==a['pwd']:
self.students()
else :
print("账号或密码不正确,请重新输入")
except StopIteration:
break
#注册
def zhuce(self):
users=input("请输入您要注册的用户名:")
pwds=input("请输入您要注册的密码:")
for user_1 in self.user2:
if users ==user_1['user']:
print("此用户已存在,注册失败!!")
else :
self.users={'user':users,'pwd':pwds}
self.user2.append(self.users)
print()
print("注册成功!")
print()
break
#修改密码
def gai(self):
users=input("请输入您注册的用户名:")
pwds=input("请输入您修改后的密码:")
for user_1 in self.user2:
if users ==user_1['user']:
user_1['pwd']=pwds
print("修改密码成功!")
else :
print("修改失败!")
#正式开始
def dljiemian(self):
while True:
super().xianshi()
xx = input("请输入你的选择:")
if xx=='1':
self.denglu()
elif xx=='2':
self.zhuce()
elif xx=='3':
break
elif xx=='4':
self.gai()
else:
print("输入错误,请重新输入")
def student(self):
while True:
super().read_file()
x=yield #生成器
if x=='1':
super().find()
elif x=='2':
super().showall()
else:
print()
print("输入错误,请重新输入")
print()
def students(self):
d=self.student()
while True:
super().jiemian2()
a=input("请输入你的选择:")
if a =='3':
break
else:
next(d) #协程
d.send(a)
def teacher(self):
super().read_file()
while True:
x=yield #生成器
if x=='1':
super().add()
elif x=='2':
super().remove()
elif x=='3':
super().modification()
elif x=='4':
super().find()
elif x=='5':
super().showall()
else:
print()
print("输入错误,请重新输入")
print()
def teachers(self):
m=self.teacher()
while True:
super().jiemian()
z=input("请输入你的选择:")
if z =='6':
break
else:
next(m)
m.send(z) #协程
def time(self,func):
def wrapper(*args,**kwargs):
start=time.time()
func() #装饰器
end=time.time()
print(f"总计用时:{end-start}")
return wrapper
if __name__=='__main__':
student1=Student()
@student1.time
def f():
student1.dljiemian()
f()
版权声明:本文为weixin_52501785原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。