某班一次考试成绩分析
学习dict基础练习作业
☆程序调试环境☆
python 3.6.6 安卓版(手机)
“知识点”:
- 基础数据类型dict list str
- print()格式打印
- 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)