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)
运行结果如下:
点个👍吧,秋梨膏!