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

时间:2015-05-29 18:59:56

标签: python function debugging user-input

Python新手在这里,所以忍受我...

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

  

编写一个名为digit_sum的函数,它将正整数n作为   输入并返回所有该数字的总和。

     

例如:digit_sum(1234)应返回10,即1 + 2 + 3 + 4.

     

(假设你给出的数字总是正数。)

所以,我尝试解决这个挑战的是编写以下代码:

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 无

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

  

哎呀,再试一次。您的函数在digit_sum上失败(434)。它返回18   什么时候应该返回11。

为什么这个错误被归还?任何人都可以澄清这里发生了什么吗?

不幸的是,没有人要问Codeacademy,你只需要发一个只有其他学生阅读的问题,所以没有得到任何见解。

4 个答案:

答案 0 :(得分:3)

您不了解变量范围或类型。那是"问题"。 (这不是一个问题,因为你正在学习。)

预期

问题是您希望提供一个接受数字的函数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
  4. 解决问题

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

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

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

      他们有很多这样的电话,每个后续电话都不会改变 lstuserNumbers

    2. 的值
    3. 这会掩盖另一个错误:您的digit_sum函数接受一个字符串。也就是说,调用它(在将上面#1中的修订结合之后)作为digit_sum(434),这是Codecademy所做的,将导致错误,因为您实际上期望它被称为digit_sum("434")
    4. 可能的解决方案

      以下功能基于您的功能,但会根据上述建议进行更改:

      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是一个 学习很多不同的东西的宏伟资源。具体来说,他们的" Intro" -level CS课程是用Python编写的,非常值得花时间。
      3. Peter Norvig的论文" Teach Yourself Programming in Ten Years"被认为是经典之作。这将是一个漫长的旅程,享受它!
      4. 再次,祝你好运。

答案 1 :(得分:1)

你有

n = userinput

当你需要时

n = userInput

然后它有效。

答案 2 :(得分:1)

作为Ezra优秀答案的后续内容,我提出了一个使用divmod builtin

的实现
def digit_sum(n):
    s = 0
    while 1:
        n, d = divmod(n, 10)
        s += d
        if n == 0 : return s

答案 3 :(得分:0)

在这里提出了解决方案,可能不是最优雅但这似乎有效(感谢Ezra,gboffi和user2357112指出我在我发布的原始代码中的初步疏忽,愚蠢的错误......):

n = 1234
def digit_sum(n):
    userNumbers = str(n)
    numList = list(userNumbers)
    dinksList = []
    for i in numList:
        new = int(i)
        dinksList.append(new)
    numSum = sum(dinksList)
    return numSum

print digit_sum(n)