实验三 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是否有全局变量;对各类函数的用法还是不够熟悉。