第一件事當然是生成學生的分數,這裡我是自己隨機生成的,直接看代碼,註釋都寫得很詳細了 1 import random 2 import json 3 4 5 def random_score(sum, bottom, top): 6 ''' 7 :param sum: 生成隨機數總數 8 :para ...
第一件事當然是生成學生的分數,這裡我是自己隨機生成的,直接看代碼,註釋都寫得很詳細了
1 import random 2 import json 3 4 5 def random_score(sum, bottom, top): 6 ''' 7 :param sum: 生成隨機數總數 8 :param bottom: 隨機數下界 9 :param top: 隨機數上街 10 :return: score_list 隨機數列表 11 ''' 12 score_list = [] 13 for i in range(sum): 14 # 用random庫的randint生成偽隨機整數 15 random_number = random.randint(bottom, top) 16 score_list.append(random_number) 17 18 return score_list 19 20 21 def write_file(filename, tmp_list): 22 ''' 23 :param filename: 寫入文件名 24 :param tmp_list: 傳入寫文件內容 25 :return: 26 ''' 27 with open(filename, 'w') as f: 28 # json.dump()可以用來編碼JSON數據,並寫入文件流 29 json.dump(tmp_list, f) 30 31 32 def main(): 33 # 主函數 34 score_list = random_score(40, 50, 100) 35 filename = 'students_score' 36 write_file(filename, score_list) 37 38 39 if __name__ == '__main__': 40 main()
第二步就是各種計算啦,註釋寫的很全同樣不解析了
1 import json 2 import math 3 import numpy 4 5 6 def read_file(filename): 7 """ 8 :param filename: 讀取文件名 9 :return: 10 """ 11 12 with open(filename, 'r') as f: 13 # json.load可以將json文件解碼成對應的數據類型 14 score_list = json.load(f) 15 return score_list 16 17 18 def cal_score(score_list): 19 """ 20 21 :param score_list: 學生全部分數 22 :return: 23 """ 24 25 # 列表本身就有找到最大最小值的函數 26 max_score = max(score_list) 27 min_score = min(score_list) 28 29 # 用math的fsum()求總和再求平均值,朴實的方法 30 average_score = math.fsum(score_list) / len(score_list) 31 # average_score = numpy.mean(score_list) 也可以,一步到位 32 33 # 偷懶使用了numpy的求中位數的函數,普通方法是找到列表最中間的或中間兩位求平均值 34 middle_score = numpy.median(score_list) 35 36 # 這裡我用了列表解析的方法來找到每個滿足條件的分數 37 fail = [score for score in score_list if score < 60] 38 d_class = [score for score in score_list if 60 <= score < 70] 39 c_class = [score for score in score_list if 70 <= score < 80] 40 b_class = [score for score in score_list if 80 <= score < 90] 41 a_class = [score for score in score_list if 90 <= score < 100] 42 43 # numpy.std()對列表內所有數求標準差 44 standard_deviation = numpy.std(score_list) 45 # 這裡標準差位數太長,使用round()控制一下精度,第一個參數為傳入長尾數的數,第二個參數為控制小數的精度 46 ctl_st_dev = round(float(standard_deviation), 2) 47 48 print("本次測試分數情況如下:") 49 # format()標準化輸出 50 print("平均分:{},最高分:{},最低分:{},成績中位數:{},成績標準差:{}(保留兩位小數)".format(average_score, 51 max_score, min_score, middle_score, ctl_st_dev)) 52 print("各分數段人數如下:") 53 print("不及格人數:{}人,60-70分之間:{}人,70-80分之間:{}人,80-90分之間:{}人" 54 ",90-100分:{}人".format(fail, len(d_class), len(c_class), len(b_class), len(a_class))) 55 56 57 def main(): 58 score_list = read_file('students_score') 59 cal_score(score_list) 60 61 62 if __name__ == '__main__': 63 main()