最近在网申投简历时遇到一个需要计算GPA的问题,想起自己在上学时写的Excel公式版GPA计算器略显low,而且操作也比较复杂,于是一时兴起,写了个Python版的,在此分享给大家!

准备工作:

用户事先准备好如下图所示的Excel表格,其中A列为每门课程的学分,B列为每门课程的成绩。成绩可以有三种合法的表示方式:

  • 百分制:支持0-100的整数或浮点数
  • 五分制:默认支持'优', '良', '中', '差', '优秀', '良好', '中等', '及格', '不及格'的表示方式,可自行定义five_list变量
  • 二分制:默认支持'通过', '不通过'的表示方式,可自行定义two_list变量

"""
GPA计算器
"""
import numpy as np
import pandas as pd # 用户定义参数
path = r'成绩单.xls' # 用户Excel文件路径 # 系统预置参数
method_list = ['STA4.0','MOD4.0_v1','MOD4.0_v2','PKU4.0'] # GPA计算方法代号列表
method_name_list = ['标准4.0方法','改进4.0方法v1','改进4.0方法v2','北大4.0方法'] # GPA计算方法名称列表
five_list = ['优', '良', '中', '差', '优秀', '良好', '中等', '及格', '不及格'] # 合法的五分制成绩
two_list = ['通过', '不通过'] # 合法的二分制成绩 # 百分制转换为4.0分制
def convert_100_4(n, method):
"""
百分制转换为4.0分制
:param n: int或float类型的百分制分数
:param method: str格式,使用的方法,应为method_list中的一个元素
:return: float类型的4.0分制分数
"""
# 标准4.0方法
if method == 'STA4.0':
if 90 <= n <= 100:
return 4.0
elif 80 <= n < 90:
return 3.0
elif 70 <= n < 80:
return 2.0
elif 60 <= n < 70:
return 1.0
elif 0 <= n < 60:
return 0.0
# 改进4.0方法v1
elif method == 'MOD4.0_v1':
if 85 <= n <= 100:
return 4.0
elif 70 <= n < 85:
return 3.0
elif 60 <= n < 70:
return 2.0
elif 0 <= n < 60:
return 0.0
# 改进4.0方法v2
elif method == 'MOD4.0_v2':
if 85 <= n <= 100:
return 4.0
elif 75 <= n < 85:
return 3.0
elif 60 <= n < 75:
return 2.0
elif 0 <= n < 60:
return 0.0
# 北大4.0方法
elif method == 'PKU4.0':
if 90 <= n <= 100:
return 4.0
elif 85 <= n < 90:
return 3.7
elif 82 <= n < 85:
return 3.3
elif 78 <= n < 82:
return 3.0
elif 75 <= n < 78:
return 2.7
elif 72 <= n < 75:
return 2.3
elif 68 <= n < 72:
return 2.0
elif 64 <= n < 68:
return 1.5
elif 60 <= n < 64:
return 1.0
elif 0 <= n < 60:
return 0 # 五分制转换为4.0分制
def convert_5_4(n):
"""
五分制转换为4.0分制
:param n: str类型的五分制分数
:return: float类型的4.0分制分数
"""
if n == '优秀' or n == '优':
return 4.0
elif n == '良好' or n == '良':
return 3.0
elif n == '中等' or n == '中':
return 2.0
elif n == '及格':
return 1.0
elif n == '不及格' or n == '差':
return 0.0 # 二分制转换为4.0分制
def convert_2_4(n):
"""
二分制转换为4.0分制
:param n: str类型的二分制分数
:return: float类型的4.0分制分数
"""
if n == '通过':
return 1.0
elif n == '不通过':
return 0.0 # 主程序
def run(): # 定义初始值
sum = 0 # 用来累加每行的学分
sumpro = [0 for i in range(len(method_list))] # 用来累加method_list中每种方法下的学分*4.0分制成绩 # 使用pandas读取为DataFrame(数字将自动转换格式)
data = pd.read_excel(path, index_col=None, header=0) # 逐行校验合法性并累加计算
for i in range(len(data)):
credit = data.iloc[i, 0] # 学分
score = data.iloc[i, 1] # 成绩 # 校验学分合法性
if isinstance(credit, str):
print('Excel表中的A' + str(i + 2) + '单元格数值不合法!学分应为非负整数或浮点数!程序异常终止!')
break
elif credit<0:
print('Excel表中的A' + str(i + 2) + '单元格数值不合法!学分应为非负整数或浮点数!程序异常终止!')
break # 校验成绩合法性并计算GPA
if isinstance(score, str):
if score in five_list:
sum += credit
sumpro = [sumpro[i] + credit * convert_5_4(score) for i in range(len(method_list))]
elif score in two_list:
sum += credit
sumpro = [sumpro[i] + credit * convert_2_4(score) for i in range(len(method_list))]
else:
print('Excel表中的B' + str(i + 2) + '单元格数值不合法!未定义的文字型成绩!程序异常终止!')
break
elif score < 0 or score > 100:
print('Excel表中的B' + str(i + 2) + '单元格数值不合法!百分制分数应在0-100之间!程序异常终止!')
break
else:
sum += credit
sumpro = [sumpro[i] + credit * convert_100_4(score, method_list[i]) for i in range(len(method_list))] else:
print('计算完毕!使用每种方法计算的GPA分别为:')
for i in range(len(method_list)):
print(method_name_list[i]+'\t '+str(sumpro[i]/sum)) if __name__ == '__main__':
run()

计算完毕后,结果将以屏幕输出的形式展现:

Python版GPA计算器的更多相关文章

  1. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  2. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  3. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  4. 数据结构:顺序表(python版)

    顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...

  5. python版恶俗古风自动生成器.py

    python版恶俗古风自动生成器.py """ python版恶俗古风自动生成器.py 模仿自: http://www.jianshu.com/p/f893291674c ...

  6. LAMP一键安装包(Python版)

    去年有出一个python整的LAMP自动安装,不过比较傻,直接调用的yum 去安装了XXX...不过这次一样有用shell..我也想如何不调用shell 来弄一个LAMP自动安装部署啥啥的..不过尼玛 ...

  7. 编码的秘密(python版)

    编码(python版) 最近在学习python的过程中,被不同的编码搞得有点晕,于是看了前人的留下的文档,加上自己的理解,准备写下来,分享给正在为编码苦苦了挣扎的你. 编码的概念 编码就是将信息从一种 ...

  8. Zabbix 微信报警Python版(带监控项波动图片)

    #!/usr/bin/python # -*- coding: UTF- -*- #Function: 微信报警python版(带波动图) #Environment: python import ur ...

  9. 豆瓣top250(go版以及python版)

      最近学习go,就找了一个例子练习[go语言爬虫]go语言爬取豆瓣电影top250,思路大概就是获取网页,然后根据页面元素,用正则表达式匹配电影名称.评分.评论人数.原文有个地方需要修改下patte ...

随机推荐

  1. SARS病毒

    每一道题目皆是一处美丽的风景: 何为科技的力量和程序的思维哦,在这暑假的编程之路上,我要好好地体验一番来嘞! 数学规律是:f(n)=2^(n-1)+4^(n-1).     //递推分析可得!具体过程 ...

  2. 劳动人民万岁(拒绝惰性)------- 浅谈迭代对象(Iterable) 迭代器(Iterator)

    一.前戏 问题:如果一次抓取所有城市天气 再显示,显示第一个城市气温时有很高的延时,并且很浪费储存空间 解决方案:以“用时访问”策略,并且能把说有城市气温封装到一个对象里,可用for一句进行迭代 二. ...

  3. 【做题笔记】CF1311A、B、C

    或许以后会有D. A 题目大意:给定两个整数 \(a,b\) ,每次可以进行一下任意一个操作: \(a\) 加上任意一个正奇数 \(b\) 减去任意一个正偶数 问是否可以通过若干次操作把 \(a\) ...

  4. DB技能数据库里把技能伤害调整

    1. MagID 技能代号 2. MagName 技能名称 3. Effect Type 效果类型(使用技能时角色的动作效果) 4. Effect 效果(技能产生的动画效果) 5. Spell 每次耗 ...

  5. codeforces Make The Fence Great Again(dp)

    题目链接:http://codeforces.com/contest/1221/problem/D 题目要求ai ! = ai-1,草纸上推理一下可以发现每一个栅栏可以升高的高度无非就是 +0,+1, ...

  6. 操作系统 - epoll中的ET和LT

    参考 https://www.quora.com/What-is-meant-by-edge-triggering-and-level-triggering http://man7.org/linux ...

  7. nginx配置指令auth_basic、auth_basic_user_file及相关知识

    参考链接 https://www.jianshu.com/p/1c0691c9ad3c auth_basic_user_file 所需要的密码,可以通过如下方法生成 1)安装htpasswd (yum ...

  8. PHP通过thrift2访问HBASE

    前一段时间需要在网页上显示HBASE查询的结果,考虑用PHP来实现,在网上搜了一下,普遍都是用thrift作为接口来实现的.​ 参考博文:​ http://www.cnblogs.com/scotom ...

  9. 排序算法之归并排序的python实现

    采用分治法: 分割:递归地把当前序列平均分割成两半. 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并). 归并操作(归并算法),指的是将两个已经排序的序列合并成一个序列的操作.归并排序 ...

  10. css3的一些特效

    前段时间有位同事分享了一个网站,里边是一些css3特效,看着挺好,分享一下: [http://daneden.github.io/animate.css/ ] 所有的特效都集中在一个css层叠样式表中 ...