[Tutor] cases with single if and an else clause
Manprit Singh
manpritsinghece at gmail.com
Wed Oct 6 07:04:43 EDT 2021
Dear Dennis Lee Bieber,
I saw your explanation about my question :
GRADES = [ (60, "F"),
(70, "D"),
(80, "C"),
(90, "B"),
(100, "A") ] #ordered list of breakpoints
These were the grades you have used, There is a problem, See if the marks
are 60 That should not be classified as F . The pattern must be like as
follows :
if marks >=90 and <= 100 ---- "A" Grade
else marks >= 80 and < 90 ---- "B" Grade
else marks >= 70 and < 80 ---- "C" Grade
else marks >= 60 and < 70 ---- "D" Grade
else marks below 60 ---- "F" or Fail
and if marks are less than 0 or greater than 100 then the program must
display "Invalid value entered":
The way i have implemented it given below:
def grades(glist, score):
if score < 0 or score > 100:
raise ValueError
for ch, rg in glist:
if score in rg:
return ch
lst = [("F", range(0, 60)),
("D", range(60, 70)),
("C", range(70, 80)),
("B", range(80, 90)),
("A", range(90, 101))]
try:
marks= int(input("Enter marks"))
grade = grades(lst, marks)
except ValueError:
print("Invalid Value Entered")
else:
print(f'for {marks} marks the grade is {grade}')
Can I make such a program without using range ?
The program is giving correct output as below :
Enter marks59
for 59 marks the grade is F
Enter marks60
for 60 marks the grade is D
Enter marks70
for 70 marks the grade is C
Enter marks79
for 79 marks the grade is C
Enter marks-3
Invalid Value Entered
Enter marks104
Invalid Value Entered
On Wed, Oct 6, 2021 at 12:10 AM Dennis Lee Bieber <wlfraed at ix.netcom.com>
wrote:
> On Tue, 5 Oct 2021 07:22:24 +0530, Manprit Singh
> <manpritsinghece at gmail.com> declaimed the following:
>
> >Dear sir,
> >
> >Now there is one more problem , Kindly loom at below written functions :
> >
> >def grade(percent):
> > if percent < 0 or percent > 100:
> > ans = "Invalid Input"
> > elif percent >= 90:
> > ans = "A"
> > elif percent >= 70:
> > ans = "B"
> > elif percent >= 60:
> > ans = "C"
> > else:
> > ans = "Fail"
> > return ans
> >
>
> My biggest concern is that you are using the same "ans" return to
> indicate invalid input, letter grades (you have a big gap between A and B
> -- at least in US you'd commonly have breakpoints A:90, B:80, C:70, D:60,
> and E (or F) at 50).
>
> Presuming the numeric grade is being entered by the user of some
> program (say a teacher's electronic grade book) the input should have been
> validated at the place it was entered, NOT in a function that just
> translates number ranges into a letter grade.
>
> If you really need to validate /in/ this function, you should be
> raising an exception... and the caller needs to catch this exception and do
> whatever is needed to correct the data before retrying the operation. As
> is, the caller is forced to test every return from the function for a
> SPECIFIC string...
>
> aGrade = grade(score)
> if aGrade == "Invalid Input":
> #do something to correct the input and retry the call to grade()
> else:
> #record the returned letter grade
>
>
>
> There are multiple ways to avoid a chain of if/elif/else
> comparisons...
> But for that you need to study /data structures/ and the algorithms using
> them rather than just playing around with simple examples that would seldom
> be used in actual applications. Especially examples that are mostly
> concerned with /coding style/ than on flexibility (algorithm reuse). If the
> code runs, it is technically correct -- but may look ugly and locked in to
> just the one application. Coding style, these days, tends to be defined by
> the company one works at, and one has to follow some guide book that
> already exists at that company. If you want to follow the One-In/One-Out of
> Structured Programming -- try to lay out your code using
> https://en.wikipedia.org/wiki/Nassi%E2%80%93Shneiderman_diagram
> (even in OOP, once one gets down to coding class methods, one should be
> back to structured programming)
>
> -=-=-=-
> C:\Users\Wulfraed\Documents\_Hg-Repositories\Python Progs>letterGrade.py
> Enter percentage grade for Abigail: -5
> Invalid numeric grade
> Please try again
> Enter percentage grade for Abigail: 45
>
> Letter grade for Abigail is F
>
>
> Enter percentage grade for Bertram: 110
> Invalid numeric grade
> Please try again
> Enter percentage grade for Bertram: 99
>
> Letter grade for Bertram is A
>
>
> Enter percentage grade for Charlie: xyz
> invalid literal for int() with base 10: 'xyz'
> Please try again
> Enter percentage grade for Charlie: 68.5
> invalid literal for int() with base 10: '68.5'
> Please try again
> Enter percentage grade for Charlie: 68
>
> Letter grade for Charlie is D
>
>
> Enter percentage grade for Edith: 77
>
> Letter grade for Edith is C
>
>
> Enter percentage grade for Francisca: 81
>
> Letter grade for Francisca is B
>
>
>
> C:\Users\Wulfraed\Documents\_Hg-Repositories\Python Progs>
> -=-=-=-
> STUDENTS = [ "Abigail",
> "Bertram",
> "Charlie",
> "Edith",
> "Francisca" ]
>
> GRADES = [ (60, "F"),
> (70, "D"),
> (80, "C"),
> (90, "B"),
> (100, "A") ] #ordered list of break points
>
> def grade(percent):
> if percent < 0 or percent > 100:
> raise ValueError("Invalid numeric grade")
> for pc, ltr in GRADES:
> if percent <= pc: return ltr
>
> for st in STUDENTS:
> while True:
> try:
> pcent = input("Enter percentage grade for %s: " % st)
> pcent = int(pcent)
> ltrGrade = grade(pcent)
> print("\nLetter grade for %s is %s\n\n"
> % (st, ltrGrade))
> break
> except ValueError as ve:
> print(str(ve))
> print("Please try again")
>
> -=-=-=-
>
> For the example, I've left GRADES as a read-only "global". For
> reuse
> purposes, it should be passed as an argument to the grade() function.
>
> This is easily modifiable for use when grading "by the curve".
> Simplified version: "C" is the mean of the scores, and one then works
> outwards; all that needs to be changed is the GRADES list; so if the mean
> came in at 60 then GRADES would look like:
>
> GRADES = [ (45, "F"),
> (55, "D"),
> (65, "C"), #allow 5 below to 5 above
> (75, "B"),
> (100, "A") ] #don't change to catch outliers
>
> If you input the scores per student first, you can have the program
> calculate the mean and modify GRADES as needed.. Granted, this simplified
> version will have problems if the scores are near the extremes... mean of
> 85 makes GRADES look like
>
> GRADES = [ (70, "F"),
> (80, "D"),
> (90, "C"), #allow 5 below to 5 above
> (100, "B"),
> (100, "A") ] #no one gets a "A"
>
> The more complex version would compute %iles using mean&std.dev. and use
> those to set the break points for letter grades.
>
>
> --
> Wulfraed Dennis Lee Bieber AF6VN
> wlfraed at ix.netcom.com
> http://wlfraed.microdiversity.freeddns.org/
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list