8. Student becomes the Teacher: Alice is still killing me


#1

Checking the forum, I know my code is correct, but I still get this msg:

Oops, try again. get_class_average([alice]) resulted in an error: 'NoneType' object is not iterable

Code is below. I've been stuck on this for 2 days now. Please give me "the silver bullet"!


lloyd = {
    "name": "Lloyd",
    "homework": [90.0, 97.0, 75.0, 92.0],
    "quizzes": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
}
alice = {
    "name": "Alice",
    "homework": [100.0, 92.0, 98.0, 100.0],
    "quizzes": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
}
tyler = {
    "name": "Tyler",
    "homework": [0.0, 87.0, 75.0, 22.0],
    "quizzes": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]
}

# Add your function below!
def average(numbers):
    total = sum(numbers)
    total = float(total)
    return total / len(numbers)
    
def get_average(student):
    homework = average(student["homework"])
    quizzes = average(student["quizzes"])
    tests = average(student["tests"])
    return 0.10 * homework + 0.30 * quizzes + 0.60 * tests   
    
a = get_average(lloyd)
b = get_average(alice)
c = get_average(tyler)

print a, b, c

def get_letter_grade(score): 
    if score >= 90:
        return "A"
    elif score >= 80 and score < 90:
        return "B"
    elif score >= 70 and score < 80:  
        return "C"
    elif score >= 60 and score < 70:
        return "D"
    else:
        return "F"
        
score = get_average(lloyd)
print get_letter_grade(score)   

def get_class_average(students):
    results = [] 
    for student in students:
        results = results.append(get_average(student))
    return average(results)


#2

There's only one NoneType value and that's None
None represents lack of value, that is for example what a function that has no return value is going to return.
"is not iterable" is saying that you tried to iterate through that None, that was probably meant to be a list.

So, what you'll need to do to find out where this happened is to reproduce the crash, the error message says how the function was called to make it happen so simply copy that, run it, and look at the resulting error message in the console.

You can now use print statements to confirm whether you're looping through a None value there by printing out the thing you're looping through. And once you agree with all the errors that there's a None value there that shouldn't be there, you'll need to start looking at where it was coming from. You might want to add more print statements along the way to make sure that you're still looking at the right thing.

I suppose the silver bullet is to observe what it's doing and compare that to what steps you want it to be carrying out.


#3

Yes, I had done that. I know I calculate the individual student averages correctly and the problem (or one of them) is calling the data with the for loop. What this has taught me is that I need a hard copy reference to draw on which keeps some of the fundamentals fresh in my mind so I can really learn them. Unfortunately, your free offering doesn't offer that. I need to find a better way to learn this.

Thank you for your note.


#4

This isn't a bug that you need documentation to find. All you need to do is observe what it's doing and compare that to what it should do.

Start at where the crash happens, use prints to confirm that there's a None there, then consider where it was obtained.


#6

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.