某班一次考试成绩分析(dict练习作业)

某班一次考试成绩分析

学习dict基础练习作业


☆程序调试环境☆
python 3.6.6 安卓版(手机)

“知识点”

  1. 基础数据类型dict list str
  2. print()格式打印
  3. while、for循环

技巧

while True:
    run()
    重写代码: if 运行通过且达想要的样子: break

代码执行的样子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


My python code

#! /usr/bin/nve python
# __*__coding: utf-8__*__

#定义分数录入函数
def score_in(s):
    """
    用传入参数s作提示,录入分数。
    键入不是数字报错"Valueerror!",
    重输。
    键入不在0~150区间,报错,重输。
    return float 分数。
    """
    while True:
        s_print = "\n"*2+" "*6+"%s: "
        score = input(s_print%s).strip() #接收键入并去除头尾空格
        try:
            score = float(score)
            if score<0 or score>150:
                s_print = "\n"*2+" "*6+"Your input '%.1f' out of range!"
                print(s_print%score)
                continue
        except ValueError as reason:
            s_print = "\n"*2+" "*4+"Your input '%s' isn\'t a number!"
            print(s_print%score)
            s_print = "\n"+"Error: "
            print(s_print+str(reason))
            continue
        return score


def file_save(name,lis):
    """
    文件存储函数:
    以传入的name为文件名,在当前目录
    保存传入的list内容为txt文件。
    return None
    """
    f = open(name+".txt", "w") #以写模式创建txt文件
    for i in lis: f.write(i[0]+": "+str(i[1])+"\n")
    f.close() #写入完成关闭文件

     
def not_repetition(lis):
    """
    列表元素去除重复元素,返回倒序排列列表
    """

    lis.sort(reverse=True)
    for i in range(len(lis)-1,-1,-1):
        if lis[i]==lis[i-1] and i>0: lis.pop(i)
    return lis


def analyse(dic):
    """
    对传入的字典分数进行统计分析,
    打印分析结果。
    return None
    """
    #提取dict中的姓名和分数,分别用list保存
    name_list = list(dic.keys())
    score_list = list(dic.values())
    #一定要用list()转换成列表,方便后续切片操作

    #计算总分平均分
    score_sum = sum(score_list)
    score_average = score_sum/len(score_list)
    #统计低于平均分人数
    people_less = 0
    for i in score_list:
        if i<score_average: people_less += 1

    #打印总分平均分及低于平均分的人数
    print("\n"*3)
    s = "全班总分:%4.1f"%score_sum
    print("%22s"%s)
    print("\n")
    s = "平均分:%4.1f"%score_average
    print("%22s"%s)
    print("\n"*2+"%22s"%"低于平均分的: %d 人。"%people_less)

    #复制分数列表
    score_sort = [i for i in score_list]
    #调用函数排序分数并去除重复分数
    score_repetition = not_repetition(score_sort)
    print("\n"*3+"%4s"%"分数排名列表:"+"\n",score_repetition)

    #列印前五名,后五名
    if len(score_repetition)<5: ranking = 1
    else: ranking = 5
    ranking_less = ranking
    #如果成绩列表人数少于5,只列印第一和倒数第一

    #print(name_list,"\n",score_list,"\n",score_repetition)
    #调试程序时,用于观察代码执行情况的语句
    print("\n"*3+"%12s"%"非常努力的:")
    for i in range(ranking):
        k = 0
        for ii in range(len(score_list)):
            if score_list[ii]==score_repetition[i]:
                if k<1: name = name_list[ii]
                else: name += " & "+name_list[ii]
                k += 1
        ranking_d = i+1
        print("\n"+"%16s"%"第%d名 "%ranking_d,name,"%6.1f"%score_repetition[i])


    print("\n"*3+"%12s"%"很有努力空间的:")
    for i in range(ranking_less):
        k = 0
        for ii in range(len(score_list)):
            if score_list[ii]==score_repetition[len(score_repetition)-1-i]:
                #print(ii,len(score_repetition)-1-i)
                #调试程序时,用于观察代码执行情况的语句
                if k<1: name = name_list[ii]
                else: name += " & "+name_list[ii]
                k += 1
        ranking_less = i+1
        print("\n"+"%16s"%"第%d名 "%ranking_less,name,"%6.1f"%score_repetition[len(score_repetition)-1-i])
    

# __main__
"""
接收分数录入,分析排名,计算总分平均分。
"""

#№1 接收用户键入分数

score_dic = {} #初始化分数存储字典
while True:
    s = "\n"*3+" "*6+"成绩录入(直接回车结束录入)"
    print(s)
    s = "\n"+" "*12+"Name: "
    name = input(s).strip() #接收键入姓名并去除头尾空格
    if name=="": break
    score = score_in("Score(0~150)") #调用分数录入函数
    score_dic[name] = score
    s = "\n"*2+" "*4+"您的录入: "+name+": "+str(score)
    print(s)

s_print = "\n"*2+" "*8+"保存输入的成绩?(Y) "
y = input(s_print)
if y=="Y" or y=="y":
    s_print = "\n"*2+" "*8+"File name: "
    file_name = input(s_print).strip()
    #转换输入的成绩为列表
    score_lis = score_dic.items()
    #调用文件存储函数保存输入的成绩
    file_save(file_name, score_lis)
    s_print = "\n"*2+" "*4+"文件 '%s.txt',已保存在当前目录。"
    print(s_print%file_name)
    s_print = "\n"+" "*12+"立即查看?(Y) "
    y = input(s_print)
    if y=="Y" or y=="y":
        f = open(file_name+".txt")
        print("\n"*2)
        for i in f: print(i, end="")
        f.close() #打印完成关闭文件

#调用分析analyse函数
analyse(score_dic)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦幻精灵_cq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值