"""

及格率:(低于及格线个数÷总成绩个数)×100%
平均值:全部成绩的总合÷总成绩个数
方差:所有成绩的平方和 ÷ 总成绩个数 - 平均值的平方

(语文成绩的平方 + 数学成绩的平方 + 英语成绩的平方) / 3 - (((语文成绩 + 数学成绩 + 英语成绩) / 3) ** 2)

1. 添加学生信息   学生姓名 学号 语文成绩 数学成绩 英语成绩
2. 根据学生学号查看学生成绩
3. 统计:各学生的平均成绩 成绩方差 班级各科及格率 平均成绩
4. 根据学号修改学生信息
5. 根据学号删除学生
6. 保存学生信息
7. 退出系统
读info.txt到score_sheet 增删改查,操作完write到info.txt,这边还没学数据库,数据只能暂时写到文本中。代码都是老师教的,仅供参考。
"""

score_sheet = [
    # {'姓名': '张开', '学号': 123, '年龄': 18, '数学': 35.0, '语文': 92.0, '英语': 88.0},
    # {'姓名': '李开', '学号': 234, '年龄': 18, '数学': 95.0, '语文': 22.0, '英语': 78.0},
    # {'姓名': '王开', '学号': 345, '年龄': 20, '数学': 66.0, '语文': 22.0, '英语': 8.0}
]

PATH = './info.txt' 

def read_file():
    with open(PATH,'r',encoding='utf-8') as f:
        title = f.readline().strip().split(',')
        # print(title)
        for line in f:
            line = line.strip().split(',')
            d = {
                title[0]:line[0],
                title[1]:int(line[1]),
                title[2]:int(line[2]),
                title[3]:int(line[3]),
                title[4]:int(line[4]),
                title[5]:int(line[5])
            }
            score_sheet.append(d)
        # print(score_sheet)
def save_data():
    with open(PATH,'w',encoding='utf-8') as f:
        f.write(','.join(score_sheet[0].keys())+'\n')
        for item in score_sheet:
            f.write(','.join([str(i) for i in item.values()])+'\n')

def save_file():
    """ 保存学生信息 """
    save_data()
    print('数据保存成功')

def add_info():
    tmp = []
    for i in score_sheet:
        tmp.append(i['学号'])
    while True:
        res1 = int(input('输入学号:').strip())
        if res1 in tmp:
            print('该学号已存在')
            continue
        res2 = input('姓名:').strip()
        res3 = int(input('年龄:').strip())
        res4 = int(input('数学:').strip())
        res5 = int(input('语文:').strip())
        res6 = int(input('英语:').strip())
        tmp_dict = {}
        tmp_dict['姓名'] = res2
        tmp_dict['学号'] = res1
        tmp_dict['年龄'] = res3
        tmp_dict['数学'] = res4
        tmp_dict['语文'] = res5
        tmp_dict['英语'] = res6
        score_sheet.append(tmp_dict)
        del tmp_dict
        print('{}添加成功'.format(res2))
        # print(score_sheet)
        break

def show_info():
    # tmp = []
    # for i in score_sheet:
    #     tmp.append(i['学号'])
    tmp = [i['学号'] for i in score_sheet] #列表生成式
    while True:
        cmd = int(input('学号列表:{}\n输入要查询的学生学号:'.format(tmp)).strip())
        if cmd in tmp:
        # #方式1
        #     user = score_sheet[int(tmp.index(cmd))]
        #     # print(score_sheet[index1])
        #     print('姓名:{} 学号:{} 年龄:{} 数学:{} 语文:{} 英语:{} 平均分:{:.2f}'.format(
        #         user['姓名'],user['学号'],user['年龄'],user['数学'],user['语文'],user['英语'],
        #         (user['数学'] + user['语文'] + user['英语']) / 3))
        #     print('退出请按1')
        # elif cmd == 1:
        #     break
        # else:
        #     print('输入的学号不存在! 退出请按1 ')
        #方式2
            for i in score_sheet:
                if i['学号'] == cmd:
                    print('姓名:{} 学号:{} 年龄:{} 数学成绩:{} 语文成绩:{} 英语成绩:{} 平均分:{:.2f}'.format(
                        i['姓名'],i['学号'],i['年龄'],i['数学'],i['语文'],i['英语'],
                        (i['数学'] + i['语文'] + i['英语']) / 3
                        ))
                    return
        else:
            print('输入的学号不存在!')

def update_info():
    tmp = [i['学号'] for i in score_sheet]  # 列表生成式
    while True:
        cmd = int(input('学号列表:{}\n输入要更新的学生的学号:'.format(tmp)).strip())
        if cmd in tmp:
            for i in score_sheet:
                if i['学号'] == cmd:
                    print(score_sheet.index(i),i)
                    #学号唯一,不允许修改
                    res1,res2 = input('新的名字:').strip(),int(input('新的年龄:').strip())
                    res3,res4,res5 = int(input('新的数学成绩:').strip()),int(input('新的语文成绩:').strip()),int(input('新的英语成绩:').strip())
                    res1 = res1 if res1 else score_sheet[i]['姓名']
                    res2 = res2 if res2 else score_sheet[i]['年龄']
                    res3 = res3 if res3 else score_sheet[i]['数学']
                    res4 = res4 if res4 else score_sheet[i]['语文']
                    res5 = res5 if res5 else score_sheet[i]['英语']
                    current_index = score_sheet.index(i)
                    score_sheet[current_index] = new_dict = {
                        '姓名': res1,
                        '学号': i['学号'],
                        '年龄': res2,
                        '数学': res3,
                        '语文': res4,
                        '英语': res5,
                    }
                    # score_sheet[current_index] = new_dict
                    print('old_dict: {}\nnew_dict: {}\nupdate successful'.format(i,new_dict))
                    return
        else:
            print('输入的学号不存在!')

def drop_info():
    tmp = [i['学号'] for i in score_sheet]  # 列表生成式
    while True:
        cmd = int(input('学号列表:{}\n输入要删除的学生的学号:'.format(tmp)).strip())
        if cmd in tmp:
            for i in score_sheet:
                if i['学号'] == cmd:
                    # print(score_sheet.index(i), i)
                    ##方式1
                    # score_sheet.pop(score_sheet.index(i))
                    ##方式2
                    score_sheet.remove(i)
                    print('old_dict: {}\ndelete successful'.format(i))
                    # print(score_sheet)
                    return
        else:
            print('输入的学号不存在!')

def count_info():
    """ 统计信息:各学生的平均成绩 成绩方差 班级各科及格率 平均成绩 """
    tmp_dict = {
        "考试总人数":0,
        "语文成绩总分数": 0,
        "语文成绩及格数": 0,
        "数学成绩总分数": 0,
        "数学成绩及格数": 0,
        "英语成绩总分数": 0,
        "英语成绩及格数": 0,
    }
    for i in score_sheet:
        print('{} 的平均成绩: {:.2f} 成绩方差: {:.2f}'.format(
            i['姓名'],
            (i['数学'] + i['语文'] + i['英语']) / 3,
            (i['数学']**2+ i['语文']**2 + i['英语']**2) / 3 - (((i['数学'] + i['语文'] + i['英语']) / 3)**2),

        ))
        tmp_dict['考试总人数'] += 1
        tmp_dict['语文成绩总分数'] += i['语文']
        tmp_dict['数学成绩总分数'] += i['数学']
        tmp_dict['英语成绩总分数'] += i['英语']
        if i['语文'] >= 60:
            tmp_dict['语文成绩及格数'] += 1
        if i['数学'] >= 60:
            tmp_dict['数学成绩及格数'] += 1
        if i['英语'] >= 60:
            tmp_dict['英语成绩及格数'] += 1
    print("""
    班级各科情况汇总:
        考数学的总人数:{} 平均成绩:{:.2f} 及格率:{:.2f}%,
        考语文的总人数:{} 平均成绩:{:.2f} 及格率:{:.2f}%,
        考英语的总人数:{} 平均成绩:{:.2f} 及格率:{:.2f}%,
        """.format(
        tmp_dict['考试总人数'],tmp_dict['数学成绩总分数']/tmp_dict['考试总人数'],tmp_dict['数学成绩及格数']/tmp_dict['考试总人数']*100,
        tmp_dict['考试总人数'],tmp_dict['语文成绩总分数']/tmp_dict['考试总人数'],tmp_dict['语文成绩及格数']/tmp_dict['考试总人数']*100,
        tmp_dict['考试总人数'],tmp_dict['英语成绩总分数']/tmp_dict['考试总人数'],tmp_dict['英语成绩及格数']/tmp_dict['考试总人数']*100,
        )
    )

def q():
    """ 退出系统 """
    choice = str(input('是否保存退出,保存退出按y,直接退出按n,y/n:'))
    if choice == 'y':
        save_data()
        exit("退出系统")
    elif choice == 'n':
        exit("退出系统")
    else:
        print('输入的不正确,重新输入!')

def main():
    """ 入口函数 """
    #获取学生列表
    read_file()
    while True:
        tmp_dict = {
            1:['添加学生信息',add_info],
            2:['根据学号查看学生信息',show_info],
            3:['根据学号更新学生信息',update_info],
            4:['根据学号删除学生信息',drop_info],
            5:['统计信息',count_info],
            6:['保存学生信息',save_file],
            7:['退出系统',q],
        }
        for k,v in tmp_dict.items():
            print(k,v[0])
        cmd = input('\n根据序号选择操作:').strip()
        if cmd.isdigit():
            cmd = int(cmd)
            # if cmd == 1:
            #     add_info()
            # elif cmd == 2:
            #     show_info()
            # elif cmd == 3:
            #     update_info()
            # elif cmd == 4:
            #     drop_info()
            # elif cmd == 5:
            #     count_info()
            # elif cmd == 6:
            #     save_file()
            # elif cmd == 7:
            #     q()
            if cmd in tmp_dict:
                tmp_dict[cmd][1]()  #拿到序号对应的函数,去执行具体的功能。
            else:
                print('请输入一个合理的序号')
        else:
            print('请输入一个数字')

if __name__ == '__main__':
    main()