8. Parts of a Whole


#1



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

Help me! for some reason my code results with this error
Oops, try again. get_class_average([lloyd]) returned 91.15 instead of 80.55 as expected

Can someone tell me what I'm doing wrong?


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 = float(sum(numbers)) / len(numbers)
    return total
def get_average(student):
    homework = average(student["homework"])
    quizzes = average(student["quizzes"])
    tests = average(student["tests"])
    return sum((homework * 0.1, quizzes * 0.3, tests * 0.6))
def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif score >=80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"  
    else:
        return "F"
print get_letter_grade(get_average(lloyd))    
def get_class_average(students):
    results = []
    students = [alice, lloyd, tyler]
    for kid in students:
        results.append(get_average(kid))
        return average(results)


#2

back that return up one indent and try that


#3

HI and put that line

students = [alice, lloyd, tyler]

outside the function on top


#4

tried it, still an error


#5

I was coming back to say this haha, do this and you should be good


#6

thank you, works like a charm. I feel lik an idiot for not seeing it.

students = [alice, lloyd, tyler]
def get_class_average(students):
results = []
for kid in students:
results.append(get_average(kid))
return average(results)


#7

Hi,

I have the same issue and rectified it with the suggested solution. However, sorry to ask a stupid question, why will the number be different if I added the "student = [alice, lloyd, tyler] outside of the function?


#8

Hi your function takes as argument students (Is the list which contain the students names) so if you put it inside the function it woudn't find so that's why it should be ouside the function


#9

Just wanted to ask why that line has to be outside the function?


#10

Hi I'm not so familiar with python but the problem of the why thee students = [..] should be outside it's about global scope and local scope
As far I know...

global scope

#here I define a global scope
students = [alice, tyler,lloyd]

#the function
def get_class_average(students):
    results = []
    for kid in students:
        results.append(get_average(kid))
    return average(results)

that variable can be use outside the function get_class_average so you can call the funciton and it will work fine

Local scope

def get_class_average(students):
    results = []
    #here we declare a local variable called students 
    students = [alice, lloyd, tyler]
    for kid in students:
        results.append(get_average(kid))
    return average(results)

#You can't access that variable outisde the function get_class_average so if you try to call it..
get_class_average(students)

its won't work because that varible is local and can only be used inside the funtion get_class_average()

HOpe that could help you understand it


#11

Why does the indent matter? How can shifting it back change the result to 91.15 instead of 85.85?