lloyd = {
"name": "Lloyd",
"homework": [90, 97, 75, 92],
"quizzes": [88, 40, 94],
"tests": [75, 90]
}
alice = {
"name": "Alice",
"homework": [100, 92, 98, 100],
"quizzes": [82, 83, 91],
"tests": [89, 97]
}
tyler = {
"name": "Tyler",
"homework": [0, 87, 75, 22],
"quizzes": [0, 75, 78],
"tests": [100, 100]
}
def average(stuff):
return sum(stuff)/len(stuff)
def getLetterGrade(score):
score = round(score)
if score >= 90: return "A"
elif 90 > score >= 80: return "B"
elif 80 > score >= 70: return "C"
elif 70 > score >= 60: return "D"
elif 60 > score: return "F"
def getAverage(kid):
bar = average
return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6
students = ["lloyd","alice","tyler"]
#takes students list
def getClassAverage(list, total = 0):
for x in list:
total += getAverage(x)
return total / len(list)
#takes students list
def classAvgFull(list):
print getClassAverage(list)
print getLetterGrade(getClassAverage(list))
classAvgFull(students)
老实说,我就是想不通哪里出了问题。任何帮助将不胜感激。我敢肯定这只是一些简单的事情。非常非常开始我的学习,使用 codeacademy.com 在此先感谢您!
请您参考如下方法:
改变
students = ["lloyd", "alice", "tyler"]
到
students = [lloyd, alice, tyler]
了解如何自己调试此类问题很重要。
错误消息告诉您问题发生在这一行:
return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6
错误与索引有关:
string indices must be integers, not str
一个自然而然的问题是,kid 的值(value)是什么?所以尝试在错误发生之前输入打印语句:
bar = average
print(repr(kid))
return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6
你会发现它打印出来了
'lloyd'
现在自然的问题变成了,kid 为什么是一个字符串, 'lloyd'?和我们真正想要什么?(答案:字典,lloyd)。如果您搜索调用 getAverage(kid) 的位置,您会发现自己在查看 getClassAverage 函数:
def getClassAverage(list, total = 0):
for x in list:
total += getAverage(x)
现在自然的问题变成了,为什么 x 是字符串 'lloyd'? 和 中的值是什么list? 同样,您可以使用打印语句来查找答案。当然,我们在哪里调用 getClassAverage(list, ...)?
这样一直往回走,终于到了
students = ["lloyd", "alice", "tyler"]
你会意识到它应该是
students = [lloyd, alice, tyler]
永远不要将变量命名为 list。它隐藏了同名的内置函数。最好使用描述性名称,例如 students,因为这样您的变量名称有助于记录代码的含义。如果变量要表示通用序列,我建议使用 seq 或 iterable 之类的变量名。
