在学习python的过程中,老师出了一道题,感觉还不错,就写个博客记录一下:

1.已知有50个学生,期末参加5门考试,每一门的权重是(0.3,0.2,0.2,0.2,0.1)

1)随机生成学生基本信息(姓名,学号)
2)随机生成每个学生的成绩
3)计算每个学生的总评成绩
4)统计总评成绩中各个分数段的人数,并画出柱状图
5)计算每门课的均值与方差,并用折线图显示出来

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import random as rm
import random
import matplotlib

#成绩生成器
def get(n):
    temp = []
    for j in range(n):
        x = rm.randint(60, 100)  # 返回1->100中的任意整数
        temp.append(x)  # 在数组后面加上相应的元素x
        # 建立了一个二维列表 c[[],[],[]....]
    return temp

#名字生成器
def random_name(j):
    list_Xing = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '张', '李']
    list_Ming = ['豫', '章', '故', '郡', '洪', '都', '新', '府', '星', '分', '翼', '轸', '地', '接', '衡', '庐', '襟', '三', '江', '', '而',
                 '带', '五', '湖', '控', '蛮', '荆', '而', '引', '瓯', '越', '物', '华', '天', '宝', '龙', '光', '射', '牛', '斗', '之',
                 '墟', '人', '杰', '地', '灵', '徐', '孺', '饯', '子']
    list_studentname = []
    for i in range(j):
        name = random.choice(list_Xing) + random.choice(list_Ming) + random.choice(list_Ming)
        list_studentname.append(name)
        # 将随机生成的五个姓名生成一个列表list_student
    return list_studentname

#柱状图生成器
def map_1(y):
    matplotlib.rcParams['font.sans-serif'] = ['YouYuan']
    matplotlib.rcParams['axes.unicode_minus'] = False
    fig = plt.figure(facecolor='#87CEEB')

    label_list = ['60~70', '70~80', '80~90', '90~100']  # 横坐标刻度显示值
    num_list1 = y  # 纵坐标值1

    x = range(len(num_list1))

    # 绘制条形图
    rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.5, color='red', label='学生')

    # 设置y轴属性
    plt.ylim(0, 50)
    plt.ylabel('人数')

    # 设置x轴属性
    plt.xticks([index + 0.2 for index in x], label_list)
    plt.xlabel("成绩")
    plt.title('学生成绩分布图')
    plt.legend()

    # 显示文本

    for rect in rects1:
        height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height + 1, str(height), ha='center', va='bottom')
    plt.show()

#折线图生成器
def map_2(X, Y):
    x = ['yuwen', 'shuxue', 'yinyu', 'pthon', 'cpp']
    y = Y
    _y = X
    plt.plot(x, y, 'rs-', x, _y, "bo-")

    plt.show()


if __name__ == "__main__":


    #生成学号
    no = []
    for i in range(1, 51):
        no.append(i)

    #使用字典
    data = {"name":random_name(50) , "yuwen": get(50), "shuxue": get(50), "yinyu": get(50), "pthon": get(50), "cpp": get(50)}
    #使用DataFrame生成一个表
    df = pd.DataFrame(data, no)

    #定义 列表hole 保存所有学生的总评成绩
    hole = []
    for i in range(1, 51):
        a = df.yuwen[i] * 0.3 + df.shuxue[i] * 0.2 + df.yinyu[i] * 0.2 + df.pthon[i] * 0.2 + df.cpp[i] * 0.1
        hole.append(a)
    #建一个表 存储总评成绩
    data3 = {}
    df3 = pd.DataFrame(data3, no)
    data2 = {"hole": hole}
    df2 = pd.DataFrame(data2, no)
    #将两个表合并,并打印
    df3 = pd.concat([df, df2], axis=1)
    print(df3)

    #统计各个分数段(暂定四段)的人数
    Y2 = [0, 0, 0, 0]
    for i in range(1, 51):
        y = df3.hole[i]
        if y >= 60 and y <= 70:
            Y2[0] += 1
            continue
        if y > 70 and y <= 80:
            Y2[1] += 1
            continue
        if y > 80 and y <= 90:
            Y2[2] += 1
            continue
        if y > 90 and y <= 100:
            Y2[3] += 1
            continue
    #调用图表生成函数
    map_1(Y2)


    arr = []
    _mean = []  # 平均值
    _var = []  # 方差
    k = ['yuwen', 'shuxue', 'yinyu', 'pthon', 'cpp']
    for j in range(5):
        for i in range(1, 51):
            arr.append(df3[k[j]][i])#使用arr保存每一列的所有单科成绩

        avg = np.mean(arr)#求出该列的平均成绩
        var = np.var(arr)#求出该列的方差
        _mean.append(avg)#存储五门成绩各自的平均值
        _var.append(var)#存储五门成绩各自的方差

    #调用图表打印函数
    map_2(_mean, _var)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐