首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPA计算返回错误

GPA计算返回错误
EN

Stack Overflow用户
提问于 2017-09-29 07:37:56
回答 3查看 60关注 0票数 0

这是我的代码,我想做一个加权的GPA计算器。我尝试用来计算GPA的公式是获得的总评分点/尝试的总学分

代码语言:javascript
复制
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

我用这些进行了测试:

代码语言:javascript
复制
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])))

返回值应为:

代码语言:javascript
复制
4.0
0.0
3.1875

但我收到一条错误消息

代码语言:javascript
复制
TypeError: 'int' object is iterable
EN

回答 3

Stack Overflow用户

发布于 2017-09-29 07:43:26

您的代码尝试在credit_attempt上调用sum(),在本例中是一个整数-0:

代码语言:javascript
复制
>>> sum(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

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

代码语言:javascript
复制
if grades == 'A':
    credit_attempt += 4.0

在这里,grades是一个列表,它永远不会等于字符串A,所以credit_attempt永远不会从初始值0开始更改。

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

票数 0
EN

Stack Overflow用户

发布于 2017-09-29 07:48:38

这里有几个错误。让我们来看几个例子,下面有一个完整的工作示例。代码中的一些问题包括:

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

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

代码语言:javascript
复制
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])))
票数 0
EN

Stack Overflow用户

发布于 2017-09-29 07:53:09

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46479758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档