Python 学生成绩管理系统

  • Post author:
  • Post category:python


要求:

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 版权协议,转载请附上原文出处链接和本声明。