2

I'm wondering why my "if" statement isn't working. I get asked for the input, and nothing happens after. It won't print out whether it is A, B, C or D.

def main():
    printLetterGradeFromNumber(input("The grade as a number: "))

def printLetterGradeFromNumber(number_grade):

    A = range(90, 100)
    B = range(80, 89)
    C = range(70, 79)
    D = range(60, 69)

    if number_grade == A:
         print("That student gets an A")
    elif number_grade == B:
        print("That student gets a B")
    elif number_grade == C:
        print("That student gets a C")
    elif number_grade == D:
        print("That student gets a D")

    return number_grade


main()
pppery
  • 3,731
  • 22
  • 33
  • 46
net Force
  • 21
  • 1
  • 2
    you want `in` not `==` – Chris_Rands Sep 27 '19 at 20:14
  • you should say `if number_grade in A` and not if `number_grade == A`. Do you think `91==(90,91,92,93,94,95,96,97,98,99)`??? the answer to that question makes your if statement not work – Onyambu Sep 27 '19 at 20:15
  • creating ranges is not a very efficient check for this, you'd be better off looking at the duplicate of the duplicate – Sayse Sep 27 '19 at 20:15
  • You need to convert your `number_grade` to `int(number_grade)` for comparison – Shan Ali Sep 27 '19 at 20:18

4 Answers4

4

There are two issues:

  • The input, inside main, needs to be converted to an int
    • Currently, the input is a str, which will never be True when tested for membership inside of A, B, C or D
    • Example: '90' == 90 compares as False, so '90' in A is False
  • Use the membership operator, in, instead of the comparison operator, ==.
def main():
    printLetterGradeFromNumber(int(input("The grade as a number: ")))

def printLetterGradeFromNumber(number_grade):
    A = range(90, 100)
    B = range(80, 89)
    C = range(70, 79)
    D = range(60, 69)

    if number_grade in A:
         print("That student gets an A")
    elif number_grade in B:
        print("That student gets a B")
    elif number_grade in C:
        print("That student gets a C")
    elif number_grade in D:
        print("That student gets a D")

    return number_grade

main()

Output:

The grade as a number:  90
That student gets an A

Alternate implementation:

  • Don’t Forget NumPy!
  • numpy.digitize
    • digitize returns the index of value, within bins. value < 60 returns index = 0, while value >= 90 returns index = 4.
    • A letter grade is found, using the index of grades. As such, the order of grades must correspond to bins.
from numpy import digitize

def print_letter_grade():
    value = int(input('The grade as a number: '))
    grades = ['F', 'D', 'C', 'B', 'A']
    index = digitize(value, bins=[60, 70, 80, 90])
    print(f'The student gets an {grades[index]}')
Trenton McKinney
  • 56,955
  • 33
  • 144
  • 158
1

I hope this is what you are looking for

def printLetterGradeFromNumber(number_grade):

    #A = range(90, 100)
    #B = range(80, 89)
    #C = range(70, 79)
    #D = range(60, 69)

    if number_grade >= 90 and number_grade <= 100:
         print("That student gets an A")
    if number_grade >= 80 and number_grade <= 89:
         print("That student gets a B")
    elif number_grade >= 70 and number_grade <= 79:
        print("That student gets a C")
    elif number_grade >= 60 and number_grade <= 69:
        print("That student gets a D")

   return number_grade
0

range(90, 100) equals (90, 91, 92, 93, 94, 95, 96, 97, 98, 99)

You need to use 'in' operator

    if number_grade in A:
         print("That student gets an A")
    elif number_grade in B:
        print("That student gets a B")
    elif number_grade in C:
        print("That student gets a C")
    elif number_grade in D:
        print("That student gets a D")
andole
  • 286
  • 1
  • 7
  • `range` returns a generator – Sayse Sep 27 '19 at 20:17
  • 1
    @andole `range` returns a range object, not a list or a tuple. Among other things, this object can test if a value is in the range without generating the values. – Thierry Lathuille Sep 27 '19 at 20:24
  • I know it doesn't return a tuple or a list. What I said in the answer is what range means in the given context. I edited the answer to make it a little less misleading. – andole Sep 27 '19 at 20:30
0

You don’t need to define a function. Use a “For” loop.

Set your grades to A=range(90, 101). B=range(80, 90), C=range(70, 80), D=range(60, 70)

When you use ranges python excludes the upper bound integer