[Python]Student Becomes the Teacher 8. Part of the Whole


#1

Here is my piece of code

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

if i run the 'result = []' that is above the def get_class_average(students):
then the result is equal to write it in that function.but it exactly showed the
"get_class_average([lloyd]) returned 85.85 instead of 80.55 as expected"
I don't it what the difference it is?


#2

Hi @ajaxblaster64167 ,

It is important to format code when you post it. That enables users to see your indentation and other important details.

See How do I format code in my posts?.

Your get_class_average function should be designed to return the correct result every time it is called. This includes situations in which the user, or Codecademy itself, calls the function multiple times during a program run. For the function to produce a correct result, it must initialize the result variable to an empty list at the beginning of every call. If you have the following, that initialization will be performed at the beginning of each execution of the function, as it should ...

def get_class_average(students):
    result = []

However, if you have this instead ...

result = []
def get_class_average(students):

... result will be initialized prior to the time the function is defined, which is also prior to the first call, and you will get a correct result from that first call. However, thereafter, result will still be carrying data from previous calls during any subsequent call to the function. This will cause it to compute incorrect results. Codecademy calls your function multiple times to test it, and if it fails a test, Codecademy issues you a message to that effect.


#3

Please check the working code for your reference:

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"])
quiz = average(student["quizzes"])
test = average(student["tests"])
return 0.1 * homework + 0.3 * quiz + 0.6 * test

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"

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

print get_class_average([lloyd, alice, tyler])


#4

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]
}
students=[lloyd,alice,tyler]

Add your function below!

def average(numbers):
total=sum(numbers)
avg=float(total)/len(numbers)
return avg
def get_average(student):
homework=average(student["homework"])
quizzes=average(student["quizzes"])
tests=average(student["tests"])
return 0.1*homework + 0.3*quizzes + \
0.6*tests
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(alice))

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

Hi. i tried the above code in IDLE , and it seems to be returning 80.55
There seems to be a problem in the console of codeacademy i guess.
Even I am getting an error,
Oops, try again. get_class_average([alice, lloyd]) returned 91.15 instead of 85.85 as expected

that is what I'm getting.


#5

@ccseace23156 ,

It is important to format code when you post it. That enables users to see your indentation and other important details.

See How do I format code in my posts?.

Since your code is not formatted, we cannot check its indentation. Make sure that the return statement in your get_class_average function is not part of the for loop.