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
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) + " ." )
try:
letter_grades = input("Enter letter grade for ")
assert letter_grades in grades
except AssertionError:
print(f"Input should be: {grades}")
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
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
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) + " ." )
try:
letter_grades = input("Enter letter grade for ")
assert letter_grades in grades
except AssertionError:
print(f"Input should be: {grades}")
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