How to verify input using try, except and assertion in python?

Question:

I have made a program to calculate GPA of student but i need to verify that if the letter grade inputted by the user is between A+ to F or not by using try, except and assert. Here’s my code:

from num2words import num2words
courses = {}
total = 0

while True:
    course_name = input("Enter course name: ")
    if(course_name == "" or course_name == " "):
        break
    else:
        courses[course_name] = []
def pointvalue(x):
    if x == "A+" or x == "a+":
        return "4.2 points"
    elif x == "A" or x == "a" :
        return "4.0 points"
    elif x == "B+" or x == "b":
        return "3.5 points"
    elif x == "B" or x == "b":
        return "3.0 points"
    elif x == "C+" or x == "c+":
        return "2.5 points"
    elif x == "C" or x == "c":
        return "2.0 points"
    elif x == "D+" or x == "d+":
        return "1.5 points"
    elif x == "D" or x == "d":
        return "1 points"

for i in range(len(courses)):
    cnames = list(courses.keys())[i]
    letter_grades = input("Enter letter grade for " + str(cnames) + ": ")
    course_credit = float(input("Enter course credit for " + str(cnames) + ": " ))
    pointg = pointvalue(letter_grades)
    courses[cnames].append(letter_grades)
    courses[cnames].append(pointg)
    courses[cnames].append(course_credit + " credits")

print("")
print("")

for i in range(len(courses)):
    cnames = list(courses.keys())[i]
    print("Course " + str(cnames) + " student grade as follows: " + str(courses[cnames]))
print("")
print("")

print("The GPA for this student with " + str((num2words(len(courses)).upper()))  + " courses would be: ")
for x in range(len(courses)):
    cnames = list(courses.keys())[x]
    gradepoints = courses[cnames][1]
    credits = courses[cnames][2]

    total = total + (int(gradepoints) * int(credits))
    if x == 0:
        print("   ( " + str(gradepoints) + " * " +str(credits) + " )")
    else:
        print(" + ( " + str(gradepoints) + " * " +str(credits) + " )")

print("----------------------------------------------")
print("Total of above "+ str(total) + " ."  )

All the courses and their grade points, and credit points must be saved in a single dictionary. 🙂
Thanks <3

Asked By: NoobProgrammer

||

Answers:

I have add one function verify_letter_grades to support verify letter_grades:

from num2words import num2words
import re

regex = r"s*[a|a+|b|b+|c|c+|d|d+|A|A+|B|B+|C|C+|D|D+]"
courses = {}
total = 0

while True:
    course_name = input("Enter course name: ")
    if(course_name == "" or course_name == " "):
        break
    else:
        courses[course_name] = []
def pointvalue(x):
    if x == "A+" or x == "a+":
        return "4.2 points"
    elif x == "A" or x == "a" :
        return "4.0 points"
    elif x == "B+" or x == "b":
        return "3.5 points"
    elif x == "B" or x == "b":
        return "3.0 points"
    elif x == "C+" or x == "c+":
        return "2.5 points"
    elif x == "C" or x == "c":
        return "2.0 points"
    elif x == "D+" or x == "d+":
        return "1.5 points"
    elif x == "D" or x == "d":
        return "1 points"

def verify_letter_grades(letter_grades):
    re_letter_grades = re.compile(regex)
    if letter_grades is not None:
        m_letter_grades = re_letter_grades.search(letter_grades)
        assert m_letter_grades is None, 'Please make sure input in range'
    else:
         assert letter_grades is None, 'Please make sure input is not None'

for i in range(len(courses)):
    cnames = list(courses.keys())[i]
    letter_grades = input("Enter letter grade for " + str(cnames) + ": ")
    verify_letter_grades(letter_grades)
    course_credit = float(input("Enter course credit for " + str(cnames) + ": " ))
    pointg = pointvalue(letter_grades)
    courses[cnames].append(letter_grades)
    courses[cnames].append(pointg)
    courses[cnames].append(course_credit + " credits")

print("")
print("")

for i in range(len(courses)):
    cnames = list(courses.keys())[i]
    print("Course " + str(cnames) + " student grade as follows: " + str(courses[cnames]))
print("")
print("")

print("The GPA for this student with " + str((num2words(len(courses)).upper()))  + " courses would be: ")
for x in range(len(courses)):
    cnames = list(courses.keys())[x]
    gradepoints = courses[cnames][1]
    credits = courses[cnames][2]

    total = total + (int(gradepoints) * int(credits))
    if x == 0:
        print("   ( " + str(gradepoints) + " * " +str(credits) + " )")
    else:
        print(" + ( " + str(gradepoints) + " * " +str(credits) + " )")

print("----------------------------------------------")
print("Total of above "+ str(total) + " ."  )
Answered By: Thuấn Đào Minh
try:
    letter_grades = input("Enter letter grade for ")
    assert letter_grades in grades
except AssertionError:
    print(f"Input should be: {grades}")
    
Answered By: quagrain

You can rewrite the pointValue function in less lines like this

#!/usr/bin/python

grades ={
    "A+" : "4.2 Points",
    "A" : "4.0 Points",
    "B+" : "3.5 Points",
    "B" : "3.0 Points",
    "C+" : "2.5 Points",
    "C" : "2.0 Points",
    "D+" : "1.5 Points",
    "D" : "1.0 Points"
}

def pointValue(x):
    if x in grades:
        return grades.get(x)

g = input("Enter Graden")
while True:
    try:
        assert g.upper() in grades
        print(pointValue(g.upper()))
        break
    except AssertionError:
        print("Invalid Entries")
        g = input("Enter Graden")

converting the input to upper() case , will reduce the duplicate entries for A and a

Answered By: Abhishek
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.