Python 函数返回正确的结果但解释器返回奇怪的错误

标签 python function debugging user-input

这里是 Python 新手,请多多包涵...

我正在尝试使用通常写得不好的 Codeacademy Python 教程,其中的练习挑战是:

Write a function called digit_sum that takes a positive integer n as input and returns the sum of all that number's digits.

For example: digit_sum(1234) should return 10 which is 1 + 2 + 3 + 4.

(Assume that the number you are given will always be positive.)

因此,我尝试编写以下代码来解决这个挑战:

userInput = raw_input("Please enter your number string here: ")
n = userInput
lst = list(n)
userNumbers = []

def digit_sum(n):
    for i in lst:
        b = int(i)
        userNumbers.append(b)
    numsum = sum(userNumbers)
    return numsum

print "This is your total: %s" % digit_sum(n)

在这个练习的控制台中,一切似乎都按预期工作:

请在此处输入您的号码字符串:123 这是你的总数:6 无

但是,解释器返回此错误(尽管控制台似乎工作正常):

Oops, try again. Your function fails on digit_sum(434). It returns 18 when it should return 11.

到底为什么会返回这个错误?谁能阐明这里发生了什么?

不幸的是,在 Codeacademy 没有人可以提问,您只能发布一个只有其他学生阅读的问题,因此不会在那里获得任何见解。

最佳答案

您不了解变量作用域或类型。那就是问题所在”。 (这不是真正的问题,因为您正在学习。)

期望值

该问题希望您提供一个接受数字并返回数字的函数 digit_sum。在这种情况下,它将接受 434 并返回 18。也就是说,digit_sum(434) = 18

你在做什么

键盘读取(raw_input)和打印(print)与本题无关。

如果我们删除您解决方案中的非功能部分,我们将:

def digit_sum(n):
    for i in lst:
        b = int(i)
        userNumbers.append(b)
    numsum = sum(userNumbers)
    return numsum

当我们尝试提交这个时,一些问题变得明显:

  1. lst 未定义。
  2. userNumbers 未定义。
  3. 您需要一个字符串 (str) 而不是一个数字 (int)

解决问题

  1. 我们必须将 userNumberslst 的定义移动到 函数 digit_sum。如果将它们设置在“顶级”级别,则它们是 每次调用该函数时都不会重置,这就是 Codecademy 的原因 没有得到正确答案。

    他们用来检查你的代码是这样的:

    if digit_sum(434) != 18:
        print "It should have been 18, we got %s" % digit_sum(434)
    

    他们有很多这样的调用,每个后续调用都不会改变 lstuserNumbers 的值。

  2. 这掩盖了另一个错误:您的 digit_sum 函数接受一个字符串。也就是说,调用它(在合并上面#1 的修复之后)作为 Codecademy 所做的 digit_sum(434) 将导致错误,因为您实际上期望它被称为 digit_sum ("434").

可能的解决方案

以下函数基于您的函数,但已根据上述建议进行了更改:

def digit_sum(n):
    lst = list(str(n))
    userNumbers = []
    for i in lst:
        b = int(i)
        userNumbers.append(b)
    numsum = sum(userNumbers)
    return numsum

您会注意到缺少其他内容:我们可以将其重新添加进去,但没有必要。您可能希望在开发时使用以下内容进行测试:

def digit_sum(n):
    lst = list(str(n))
    userNumbers = []
    for i in lst:
        b = int(i)
        userNumbers.append(b)
    numsum = sum(userNumbers)
    return numsum

print "digit_sum(%s) = %s" % (434, digit_sum(434))
print "digit_sum(%s) = %s" % (123, digit_sum(123))
print "digit_sum(%s) = %s" % (555, digit_sum(555))
print "digit_sum(%s) = %s" % (18, digit_sum(18))
print "digit_sum(%s) = %s" % (1001, digit_sum(1001))

当你运行它时,它会产生:

digit_sum(434) = 11
digit_sum(123) = 6
digit_sum(555) = 15
digit_sum(18) = 9
digit_sum(1001) = 2

好消息是这些结果都是正确的,所以您有了一个好的开始!您会很快了解到的一件事是,在编程中有时细小乏味的细节非常重要。

小记

这并不总是那么容易或显而易见。所谓的专家是从零开始的,也要学习,也要犯错。不要气馁!您必须了解 很多 不同的概念才能 100% 了解正在发生的事情。没有人能一下子搞定。

我尊重您努力学习和快速成长,以及您愿意提出问题这一事实。这绝非易事,但当你试图理解所有这些时,你的大脑可能会有点烧灼感,这就是学习的感觉。拥抱它!问问题!

祝你学习顺利!

其他资源

  1. 如果可以的话,我推荐 Zed Shaw 的 Learn Python the Hard Way作为一个 为您的学习之旅提供优质、免费的补充。太棒了!
  2. 我还发现 Udacity's Free Online Courses区域 学习很多不同事物的绝佳资源。具体来说,他们的“入门”级 CS 类(class)是用 Python 授课的,非常值得花时间。
  3. Peter Norvig 的论文“Teach Yourself Programming in Ten Years”被认为是经典之作。这将是一段漫长的旅程,好好享受吧!

再次祝你好运。

关于Python 函数返回正确的结果但解释器返回奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30537142/

相关文章:

python - 滚动时间窗口上的 Pandas `value_counts`

python - 提高 float 除法的准确性(python)

javascript - 无法删除标签 gmail api

c - 操作函数中的整数数组时发生堆栈粉碎错误

c - Netbeans C 远程调试器反汇编仅查看

debugging - 尽管 webpack 源映射,jsx React 调试器仍不匹配

python - 如何迭代 3D numpy 数组

python - 检查 CSV 文件不包含任何字符,只包含空格和制表符

python - 如何让一个函数在另一个函数中运行,但从每个函数中的不同列表进行评估?

c - bool 表达式+短路