Python 统计考试成绩 构造多函数【简单易懂,注释超全,代码可以直接运行】

Python 统计考试成绩 构造多函数【简单易懂,注释超全,代码可以直接运行】

接上一条文章已经可以输出正确的排序结果了,室友不死心揪着多函数字眼不放,我就又把之前的一个大函数给拆解了。
在这里插入图片描述
唉,这就很没办法
在这里插入图片描述
上一条文章的地址:
https://blog.csdn.net/weixin_45527999/article/details/120668685?spm=1001.2014.3001.5501
在这里插入图片描述
业务需求:
每次考试之后,教师都要统计考试成绩,- 般包括:平均分,以及对所有人按成绩从高到低排队,
谁成绩最好,谁成绩最差等。编程实现考试成绩统计。为了简化,以字典形式表示考试成绩记录。
每个功能都单独使用函数实现。
关键技术分析:
最高分或最低分,可能有人并列。
要实现不同长度的字典作为输入值。
输出结果中,除了平均分,其他的都要有姓名和分数两项,否则都匿名了,怎么刺激学渣、表扬学霸呢?
个人感觉这个题很是离谱,不论是求解平均分后,将其作为一个新的关键字放入到原本的字典中,还是将以放入字典中的平均分再次进行排序,都是一个不小的挑战,同时也是这道题的两个最大的难点,写出来实属不易,花费了我将近一个小时的时间,点个👍吧
这个题的核心用的是list 与 字典的相互转化,一定要用好python中的复合数据类型,即字典中套字典,列表中套字典,然后根据列表的索引将最新更新的字典放进去,进而达到排序的效果。同时注意要做好flag标记索引和排名student_top不断变化的准备。
对于其他的例如关键字参数的不定长的参数的设置是基本知识,字典中更新新的关键字参数是课本上所没有的知识。del()函数的使用是用来控制循环的次数,也是循环的出口,一定要控制好

多函数代码如下:

import math


def func_avg(**kwargs):
    list_mid = []
    list1 = []
    max = 0
    flag = 0
    flag1 = 0
    student_top = 1  # 用来标记排名
    # print(len(kwargs))
    for i in kwargs.values():
        sum = 0
        # print(i)
        avg = (i['math'] + i['English']) / 2
        avg_sorce = {'平均分': avg}
        i.update(avg_sorce)
        list1.append(i)
    return list1

def func_sort(*kwargs):
    list_mid = []
    max = 0
    flag = 0
    flag1 = 0
    student_top = 1  # 用来标记排名
    #print(list1)做测试用
    while (len(list1) > 0):
        max = list1[0]['平均分']
        for i in range(0, len(list1)):
            # print(i)做测试用
            if (list1[i]['平均分'] > max):
                max = list1[i]['平均分']
                flag = i
            top = {'排名': student_top}
            list1[flag].update(top)  # 不断地更新最高分数的排名
        for i in range(1,len(list1)):#重新跑一次循环用于检查list里面是否存在同样高的分数
            if((list1[i]['平均分'] == max) and (flag != i)):
                flag1 = i
                top = {'排名': student_top}
                list1[flag1].update(top)
                list_mid.append(list1[flag1])
                del(list1[flag1])

        list_mid.append(list1[flag])#将得到的新字典重新放入一个新的列表中,同时将其根据分数进行排序
        del (list1[flag])  # 让list1的长度不断减1,达到退出循环的目的,同时也将最高分剔除出去,重新规划剩余分数的最高分
        flag = 0#设置标签与最开的max去第0位的分数相对应,用来记录最高分数所在的位置
        student_top += 1#用于设置排名的变化
    for item in list_mid:
        print(item)


if __name__ == '__main__':
    item = {"student1": {'name': 'yubenben', 'math': 99, 'English': 100},
            'student2': {'name': "Anine", 'math': 99, 'English': 99},
            'student3': {'name': "Alei", 'math': 100, 'English': 100},
            'student4': {'name': "zhengyuan", 'math': 99, 'English': 99}}
    list1 = func_avg(**item)#用于输入不定长的参数
    func_sort(*list1)

运行结果如下:
在这里插入图片描述
点个👍吧,秋梨膏!

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henu-于笨笨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值