【Python】实验三 Python函数

实验三 Python函数

一、实验目的:
1、熟练函数的定义及表示
2、掌握pip安装第三方python库
3、灵活运用第三方库解决实际应用。
二、实验要求:
1、要求有任务独立在计算独立完成实验任务
2、每题前面要有注释说明班级、学号姓名、以及题目说明
3、所有编写程序要求编程界面友好,互动性好。
4、课程结束前在学习通提交课内完成任务的代码,课后补充完成本实验报告
三、实验内容:
编写程序:读取指定EXCEL
grade.xlsx
中的成绩,并生成统计图表 :
说明
1) 定义getScores(filepath), 返回成绩列表scoreList,使用xlrd库读取Excel中的成绩
2) 定义getLevel(scoreList), 判断等级, 返回等级列表levelList,
3) 定义genShape(levelList), 生成图形,使用matplotlib.pyplot生成成绩分布饼状图、雷达图(任选)等:>=90 优秀,89-80 良好,79-70 中等,69-60 及格,<60 不及格
4) 定义main() 按照过程执行
5) 此程序需安装xlrd库和matplotlib库
a.
a) pip install xlrd
b.
c.
b) pip install matplotlib
d.

四、编程实现
设计思路(各方法中的设计步骤):

首先在GetScores函数中使用open_workbook读取excle,
然后运用两个for循环去将excle里面的数据去存在sco_list2列表中,然后返回列表,
接着在GetLevel函数中,通过比较去获取优秀,良好,中等,及格,不及格的人数,以lev_list1(列表)的形式储存并返回,
最后利用GenShape_Bar函数绘制成绩分布条形统计图。

实验代码:

import tkinter
import xlrd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import numpy as np

#使用xlrd库读取Excel中的成绩 返回成绩列表sco_list
def GetScores() -> list:
    data = xlrd.open_workbook("grade.xlsx")
    sheet = data.sheet_by_index(0)
    sco_list1 = []
    sco_list2 = []
    for c in range(sheet.nrows):
        for i in range(6):
            sco_list1.append(sheet.row(c)[i].value)
        sco_list2.append(sco_list1)
        sco_list1 = []
    return sco_list2

#判断等级, 返回等级列表levelList
def GetLevel() -> list:
    sco_list1 = GetScores()
    lev_list1 = []
    s = [0, 0, 0, 0, 0]
    for i in range(3, 6):
        for row in range(len(sco_list1) - 1):
            if sco_list1[row + 1][i] >= 90:
                s[0] += + 1
            elif sco_list1[row + 1][i] >= 80:
                s[1] += + 1
            elif sco_list1[row + 1][i] >= 70:
                s[2] += + 1
            elif sco_list1[row + 1][i] >= 60:
                s[3] += + 1
            else:
                s[4] += + 1
        lev_list1.append([s[0], s[1], s[2], s[3], s[4]])
        s = [0, 0, 0, 0, 0]
    return lev_list1

p1 = {}
p2 = {}
p3 = {}

def List_dict():
    sco_list = ['优秀', '良好', '中等', '及格', '不及格']
    lev_list = GetLevel()
    for i in range(5):
        p1[sco_list[i]] = lev_list[0][i]
        p2[sco_list[i]] = lev_list[1][i]
        p3[sco_list[i]] = lev_list[2][i]

def GenShape_Bar():
    # 设置中文字体和负号正常显示
    # 设置rc参数显示中文标题
    # 设置字体为SimHei显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置正常显示字符
    plt.rcParams['axes.unicode_minus'] = False
    # 设置标题
    sco_list = ['优秀', '良好', '中等', '及格', '不及格']
    num_list1 = GetLevel()[0]
    num_list2 = GetLevel()[1]
    num_list3 = GetLevel()[2]
    # Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型,
    # 所以打印的时候不会打印列表。Python3 list() 函数是对象迭代器,
    # 可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。
    y = range(1, len(num_list1) + 1)
    # 就是将y(range(1, 6))里面的每一个进行*1.5然后组成列表
    y = [index * 1.5 for index in y]
    # 条形统计图
    # alpha 透明度
    plt.barh(y, num_list1, height=0.4, color='steelblue', alpha=0.5, label = '数学',)
    plt.barh([index-0.4 for index in y], num_list2, height=0.4, color='red', alpha=0.5, label = '语文')
    plt.barh([index-0.8 for index in y], num_list3, height=0.4, color='yellow', alpha=0.5, label = '英语')

    # y轴刻度  第一个参数表示刻度线显示标注的地方(列表) 第二个为每个刻度线的标签(需要是列表
    plt.yticks([index-0.2 for index in y], sco_list)
    plt.ylabel('等级列表')
    plt.xlim(0, 50)
    plt.xlabel('人数')

    # 添加文本信息(参数解释)
    for x, y1 in zip(num_list1, y):
        plt.text(x+0.8, y1-0.1, str(x), ha='center', va='bottom')
    for x, y2 in zip(num_list2, y):
        plt.text(x+0.8, y2-0.5, str(x), ha='center', va='bottom')
    for x, y2 in zip(num_list3, y):
        plt.text(x+0.8, y2-0.9, str(x), ha='center', va='bottom')

    # 显示图例
    plt.legend()
    plt.show()

def tk_mat():
    root = tkinter.Tk()
    root.title("周心怡 2020211001000104")
    fig = Figure(figsize=(5, 4), dpi=100)
    # axc = fig.add_subfigure(111)
    # axc.plt()  这两句有问题
    canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack()

tk_mat()

运行截图:
在这里插入图片描述

五、实验总结(不足与收获)
收获:1.了解了matplotlib、xlrd两个库的使用方法,
2.了解到函数若需要返回列表就需要使用def GetScores() -> list: 定义函数;
不足:在安装包时,需要注意python是否有全局变量;对各类函数的用法还是不够熟悉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

almostspring

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

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

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

打赏作者

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

抵扣说明:

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

余额充值