Struggling on Student Becomes the Teacher Lesson, Exercise 8: "Part of the Whole"


#1

Okay, I’ve been going through all the other topics like this one but I have found no answer that can solve my problem - so I decided I will upload my problem personally as I cannot find the error within my code.

The code that I’ve written gave me the error: “get_class_average([lloyd]) returned 85.85 instead of 80.55 as expected” - so I can only guess it’s an arithmetic error that lies within the code, not the semantics itself
Here is my 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]
}

results = []

# Add your function below!
def average(numbers):
  total = float(sum(numbers))
  total /= len(numbers)
  return total

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

def get_class_average(class_list):
  for students in class_list:
    results.append(get_average(students))
  return average(results)
  
print get_letter_grade(get_average(lloyd))```

#2

well, calling the get_class_average function multiply times will cause results to accumulate data because results is not declared inside the function.


#3

I don’t quite understand, can you point out the code?


#4

what do you not understand? Its difficult to explain the unknown. Look:

def get_class_average(class_list):
  for students in class_list:
    results.append(get_average(students))
  return average(results)

# first function call 
print get_class_average(['alice'])
# second function call
print get_class_average(['lloyd', 'tyler'])
# second function call prints incorrect class average 

the second function call will still contain alice her grade, while we only want to calculate the class average with lloyd and tyler. The reason for this is that results doesn’t get “reset” to an empty list every function call, because its declared outside the function


#5

ah I see, I understand now - you needn’t be so harsh. Thanks for your reply


#6