get_class_average() not working 8.Part of the Whole from UNIT 6: STUDENT BECOMES THE TEACHER


#1


https://www.codecademy.com/courses/python-beginner-en-qzsCL/1/4?curriculum_id=4f89dab3d788890003000096

Error message : get_class_average([alice]) resulted in an error: 'NoneType' object is not iterable

I expected the function get_class_average([lloyd])
would return the averaged value of lloyd's scores but it doesnt work


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]
}

def average(numbers):
   #the variable is expected to be a list.
    total=sum(numbers)
    total=float(total)
    return total/len(numbers)

def get_average(student):
    #the variable is expected to be a dictionary
    ave=0
    ave=float(ave)
    homework=average(student['homework'])
    quizzes=average(student['quizzes'])
    tests=average(student['tests'])
    ave=0.1*homework+0.3*quizzes+0.6*tests
    return ave

def get_class_average(students):
    #students is expected to be a list
    results=[]
    for student in students:
        results=results.append(get_average(student))
    return average(results)

print(get_class_average([lloyd]))


#2

list.append returns None, it has the side effect that it appends something to the list that it was called on, but you should not be using its return value since.. It isn't a meaningful value, it's a lack thereof.


#3

Thank you for your help! I didnt know that list.append() method returns None. Now the problem solved!


#4

I think it's valuable to study what happened when you get stuck a while and later find the solution - see if there's a way it could have been found faster/better.

We certainly can't memorize them all, it helps, but we can't do it for all, for the rest we just need to be able to figure out what went down.

So you had..

Which gives you an input it fails for which you can use, looks like the one you've got with lloyd has about the same effect.

And then you'd get an error message with a line number, same error, but the line number tells you where it happened which is more info than before.

So you can look closer at that line, perhaps the error alone is enough to determine that results is None, otherwise print statements would tell you so.

And then you just have to look for where you last assigned to it.