GPA计算器(除以零) - Python

时间:2018-03-16 17:23:38

标签: python function zero

这是我的简单GPA计算器代码。我收到错误(见报告),即使列表中有一个课程,我按照输入并输入课程。也许它与调用displayOutputTable函数的位置有关?

class Course(object):
    def __init__(self, courseName, letterGrade):
        self.courseName = courseName
        self.letterGrade = letterGrade


courseList = []

def acceptInput():
   courseList = []
   choice = input("Type ‘a’ to add new class or ‘e’ to end. ")
   if choice == 'a':
       courseName = input("Class Name? ")
       letterGrade = input("Grade? ")
   course = Course(courseName, letterGrade)
   courseList = courseList + [course]   
   print(courseList)
    # Create Course object using local data from user 
    # Add this new course object to courseList list 

def convertGradeToPoints(letterGrade):
  creditValue = 0  
  for i in courseList:
        if letterGrade == "A":
           creditValue = 4.0
        if letterGrade == "B":
           creditValue = 3.0
        if letterGrade == "C":
           creditValue = 2.0
        if letterGrade == "D":
           creditValue = 1.0
        if letterGrade == "F":
           creditValue = 0.0


        return creditValue

def calculateGPA():
    numbercourseList = len(courseList)
    totalpoints = 0
    for course in courseList:
        totalpoints  =  totalpoints + convertGradeToPoints(course.letterGrade)
    return totalpoints/numbercourseList

def displayOutputTable():
    print ("COURSE NAME \t LETTER GRADE \t POINTS")
    print("-------------------------")
    for course in courseList:
        print(course.courseName + "\t" + course.letterGrade + "\t" + convertGradeToPoints(course.letterGrade))   


    print("Total unweighted gpa" + "\t" + str(calculateGPA()))

acceptInput()
displayOutputTable()

这是错误报告:

Traceback (most recent call last):
  File "C:/Users/Fred/Desktop/tester.py", line 56, in <module>
    displayOutputTable()
  File "C:/Users/Fred/Desktop/tester.py", line 53, in displayOutputTable
    print("Total unweighted gpa" + "\t" + str(calculateGPA()))
  File "C:/Users/Fred/Desktop/tester.py", line 44, in calculateGPA
    return totalpoints/numbercourseList
ZeroDivisionError: int division or modulo by zero

1 个答案:

答案 0 :(得分:2)

当然[]是一个全局变量。您只能通过将全局变量声明为全局变量以将全局变量绑定到本地作用域来重新分配本地作用域中的全局变量。否则,当您执行 courseList = [] 时,实际发生的是名为courseList的新变量在本地范围内分配了一个列表。

def acceptInput():
   global courseList
   courseList = []
   choice = input("Type ‘a’ to add new class or ‘e’ to end. ")
   if choice == 'a':
       courseName = input("Class Name? ")
       letterGrade = input("Grade? ")
   course = Course(courseName, letterGrade)
   courseList = courseList + [course]   
   print(courseList)
    # Create Course object using local data from user 
    # Add this new course object to courseList list 

或者,通过仅改变LIST对象而不重新分配它来实现它的方法。

def acceptInput():
       courseList.clear()
       choice = input("Type ‘a’ to add new class or ‘e’ to end. ")
       if choice == 'a':
           courseName = input("Class Name? ")
           letterGrade = input("Grade? ")
       course = Course(courseName, letterGrade)
       courseList.append(course)   
       print(courseList)
        # Create Course object using local data from user 
        # Add this new course object to courseList list 

此外,不确定为什么每次接受新课程输入时都要清除课程列表。你这样只会有一门课程。

编辑您的评论:

  

我如何制作它以便控制台在我之后不断询问我输入   提交一个班级

答案是使用循环结构,这是每种命令式编程语言的基本基本结构。如果您不知道这一点,也许您可​​以考虑从基本的Python教程中学习,例如LearnPythonTheHardWay。

我还会包含一个sigterm / sigint处理程序来处理ctrl + c,无异常。

import signal
stop = False
def exit():
    global stop
    stop = True
signal.signal(signal.SIGINT, lambda signum, frame: exit())
signal.signal(signal.SIGTERM, lambda signum, frame: exit())
while not stop:
    acceptInput()
    displayOutputTable()