Part of the whole - Indentation Issue


#1

Can someone explain the difference in this return indentation?

This doesn't work:

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

This does work:

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

I don't understand what is changing with the indentation.

Thank you!

See full code below:

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)/float(len(numbers))
    return total
    
def get_average(student):  
    homework = average(student["homework"]) *0.1
    quizzes = average(student["quizzes"]) *0.3
    tests = average(student["tests"]) * 0.6
    
    avrg = homework + quizzes + tests
    
    return avrg
    
# get a letter

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))
print get_letter_grade(get_average(alice))
print get_letter_grade(get_average(tyler))

# class averages
students = [lloyd, alice, tyler]

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


print get_class_average([alice, lloyd])

#2

If I'm not mistaken the second result "ends" the for. Essentially you want to return the final result of the for. Indenting it within the for means that you are still continuing the for. At least that's how I understand it.


#3

Should a loop have a return statement embedded in it? Only with a conditional.

for ...
    if ...
        return ...

Otherwise, no.

caller
    callee
    return
return value in caller scope

Now if scope is an unknown concept, then definintely study it. This goes without saying.

Next comes block scope which is of paramount importance to a Python interpreter. Get intimate with that concept.


#4

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