Python 函数返回正确的结果但解释器返回奇怪的错误
Python function returning correct result but interpreter returning strange error
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
None
但是,解释器 returns 这个错误(尽管控制台似乎工作正常):
Oops, try again. Your function fails on digit_sum(434). It returns 18
when it should return 11.
到底为什么会返回这个错误?谁能阐明这里发生了什么?
不幸的是,在 Codeacademy 没有人可以提问,您只能 post 一个只有其他学生阅读过的问题,所以不会在那里获得任何见解。
你有
n = userinput
在你需要的时候
n = userInput
然后就可以了。
您不了解变量作用域或类型。那就是 "problem"。 (这不是真正的问题,因为你正在学习。)
预期结果
该问题希望您提供一个接受数字的函数 digit_sum
,并且 return 是一个数字。在这种情况下,它将接受 434
和 return 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
当我们尝试提交这个时,一些问题变得明显:
lst
未定义。
userNumbers
未定义。
- 您需要的是字符串 (
str
) 而不是数字 (int
)
解决问题
我们必须将 userNumbers
和 lst
的定义移动到
函数 digit_sum
。如果将它们设置在 "top" 级别,则它们是
每次调用该函数时都不会重置,这就是 Codecademy 的原因
没有得到正确答案。
他们用来检查你的代码是这样的:
if digit_sum(434) != 18:
print "It should have been 18, we got %s" % digit_sum(434)
他们有很多这样的调用,每个后续调用都不会改变
lst
或 userNumbers
.
的值
- 这掩盖了另一个错误:您的
digit_sum
函数接受一个字符串。也就是说,调用它(在合并上面#1 的修复之后)为 digit_sum(434)
这就是 Codecademy 所做的,将导致错误,因为您实际上期望它被称为 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% 了解正在发生的事情。没有人能一下子搞定。
我尊重您努力学习和快速成长,以及您愿意提出问题这一事实。这绝非易事,但当你试图理解所有这些时,你的大脑可能会有点烧灼感,这就是学习的感觉。接受它!问问题!
祝你学习顺利!
其他资源
- 如果可以的话,我推荐 Zed Shaw 的 Learn Python the Hard Way 作为
为您的学习之旅提供优质、免费的补充。太棒了!
- 我还发现 Udacity's Free Online Courses 是
学习很多不同事物的绝佳资源。具体来说,他们的 "Intro" 级 CS 课程在 Python 中,非常值得花时间。
- Peter Norvig 的文章“Teach Yourself Programming in Ten Years”被认为是经典之作。这将是一个漫长的旅程,享受它!
再次祝你好运。
作为 Ezra 出色回答的后续,我提出了一个使用 divmod
builtin
的实现
def digit_sum(n):
s = 0
while 1:
n, d = divmod(n, 10)
s += d
if n == 0 : return s
在这里提出了解决方案,可能不是最优雅的,但这似乎可行(感谢 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)
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 None
但是,解释器 returns 这个错误(尽管控制台似乎工作正常):
Oops, try again. Your function fails on digit_sum(434). It returns 18 when it should return 11.
到底为什么会返回这个错误?谁能阐明这里发生了什么?
不幸的是,在 Codeacademy 没有人可以提问,您只能 post 一个只有其他学生阅读过的问题,所以不会在那里获得任何见解。
你有
n = userinput
在你需要的时候
n = userInput
然后就可以了。
您不了解变量作用域或类型。那就是 "problem"。 (这不是真正的问题,因为你正在学习。)
预期结果
该问题希望您提供一个接受数字的函数 digit_sum
,并且 return 是一个数字。在这种情况下,它将接受 434
和 return 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
当我们尝试提交这个时,一些问题变得明显:
lst
未定义。userNumbers
未定义。- 您需要的是字符串 (
str
) 而不是数字 (int
)
解决问题
我们必须将
userNumbers
和lst
的定义移动到 函数digit_sum
。如果将它们设置在 "top" 级别,则它们是 每次调用该函数时都不会重置,这就是 Codecademy 的原因 没有得到正确答案。他们用来检查你的代码是这样的:
if digit_sum(434) != 18: print "It should have been 18, we got %s" % digit_sum(434)
他们有很多这样的调用,每个后续调用都不会改变
lst
或userNumbers
. 的值
- 这掩盖了另一个错误:您的
digit_sum
函数接受一个字符串。也就是说,调用它(在合并上面#1 的修复之后)为digit_sum(434)
这就是 Codecademy 所做的,将导致错误,因为您实际上期望它被称为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% 了解正在发生的事情。没有人能一下子搞定。
我尊重您努力学习和快速成长,以及您愿意提出问题这一事实。这绝非易事,但当你试图理解所有这些时,你的大脑可能会有点烧灼感,这就是学习的感觉。接受它!问问题!
祝你学习顺利!
其他资源
- 如果可以的话,我推荐 Zed Shaw 的 Learn Python the Hard Way 作为 为您的学习之旅提供优质、免费的补充。太棒了!
- 我还发现 Udacity's Free Online Courses 是 学习很多不同事物的绝佳资源。具体来说,他们的 "Intro" 级 CS 课程在 Python 中,非常值得花时间。
- Peter Norvig 的文章“Teach Yourself Programming in Ten Years”被认为是经典之作。这将是一个漫长的旅程,享受它!
再次祝你好运。
作为 Ezra 出色回答的后续,我提出了一个使用 divmod
builtin
def digit_sum(n):
s = 0
while 1:
n, d = divmod(n, 10)
s += d
if n == 0 : return s
在这里提出了解决方案,可能不是最优雅的,但这似乎可行(感谢 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)