GPA Calc返回错误

时间:2017-09-28 23:37:56

标签: python algorithm

这是我的代码,我正在尝试制作加权GPA计算器。我试图用来计算GPA的公式是[获得的总成绩点数/尝试的总学分数]:

def gpa_calculator(grades, credit_worth):
    grades = ['A', 'B', 'C', 'D', 'F']
    credit_worth = [4, 3, 2, 1, 0]
    credit_attempt = 0

    if grades == 'A':
        credit_attempt += 4.0
    if grades == 'B':
        credit_attempt += 3.0
    if grades == 'C':
        credit_attempt += 2.0
    if grades == 'D':
        credit_attempt += 1.0
    if grades == 'F':
        credit_attempt += 0.0

    GPA = (sum(credit_attempt)) / (sum(credit_worth))
    return GPA

我测试了这些:

print("Testing gpa_calculator() with grades = ['A', 'A', 'A', 'A'], credit_worth = [4, 3, 2, 3]: " + str(
    gpa_calculator(['A', 'A', 'A', 'A'], [4, 3, 2, 3])))  
print("Testing gpa_calculator() with grades = ['F', 'F', 'F', 'F'], credit_worth = [2, 4, 3, 5]: " + str(
    gpa_calculator(['F', 'F', 'F', 'F'], [2, 4, 3, 5])))  
print("Testing gpa_calculator() with grades = ['F','A','B','A','A'], credit_worth = [2,5,5,3,1]: " + str(
    gpa_calculator(['F', 'A', 'B', 'A', 'A'], [2, 5, 5, 3, 1])))

返回值应为:

4.0
0.0
3.1875

但我收到错误消息

TypeError: 'int' object is iterable

3 个答案:

答案 0 :(得分:0)

您的代码尝试在sum()上调用credit_attempt,这是一个整数 - 在这种情况下为0:

>>> sum(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

设置credit_attempt的代码也是错误的:

if grades == 'A':
    credit_attempt += 4.0

此处grades是一个列表,永远不会等于字符串A,因此credit_attempt永远不会从其初始值0更改。

此外,该函数会立即覆盖具有固定值的参数gradescredit_worth的值。

答案 1 :(得分:0)

这里有几个错误。让我们来看看它们中的几个,底部有一个完整的工作示例。您的代码中的一些问题是:

  • 即使您在grades中接收credit_worthgpa_calculator,也会立即用设定值替换它们,这意味着该函数将始终返回相同的值(如果它返回任何值)
  • 您希望迭代每个成绩及其相应的学分值,而不是一次性处理整个列表。由于grades是一个列表,因此它永远不会等于任何字符串(例如['A', 'B', 'C'] != 'A'
  • 您总结credit_attempt,但credit_attempt是一个浮点数,并且已经是收到的信用额的总和。它的名字也有些差,因为它是收到的总信用额度,而不是尝试的总信用额度。

以下是修复这些错误的工作示例,并使用稍微更清晰的方式从成绩字母字符串中获取GPA值:

def gpa_calculator(grades, credit_worth):
    gpa_value_dict = {
        'A': 4.0,
        'B': 3.0,
        'C': 2.0,
        'D': 1.0,
        'F': 0.0,
    }
    total_credit = 0
    for grade, credit in zip(grades, credit_worth):
        total_credit += gpa_value_dict[grade] * credit

    GPA = total_credit / sum(credit_worth)
    return GPA

print("Testing gpa_calculator() with grades = ['A', 'A', 'A', 'A'], credit_worth = [4, 3, 2, 3]: " + str(
    gpa_calculator(['A', 'A', 'A', 'A'], [4, 3, 2, 3])))  
print("Testing gpa_calculator() with grades = ['F', 'F', 'F', 'F'], credit_worth = [2, 4, 3, 5]: " + str(
    gpa_calculator(['F', 'F', 'F', 'F'], [2, 4, 3, 5])))  
print("Testing gpa_calculator() with grades = ['F','A','B','A','A'], credit_worth = [2,5,5,3,1]: " + str(
    gpa_calculator(['F', 'A', 'B', 'A', 'A'], [2, 5, 5, 3, 1])))

答案 2 :(得分:0)

您的错误是因为credit_attempt变量是单个值,一个int,因此不可迭代。 sum()旨在对可迭代对象(如列表)执行操作。您可以使用credit_attempt = []进行初始化,以创建一个空列表。

我还应该指出,传入的函数参数不会在任何地方使用,因为你会立即用函数顶部的静态列表覆盖它们。