我已经学习 Python 大约 3 周了,所以我正在做的事情显然会非常简单。我已经编写了几个返回某些计算值的程序,并且我已经成功地在这些程序的函数中使用了异常。我目前正在编写的程序只是为了让我多练习编写函数、while 循环和异常。这是我到目前为止所得到的:
def factorial(n):
while n > 0:
return n * factorial(n-1)
return 1
print factorial(n)
def user():
n = int(raw_input("What number would you like to use?"))
try:
factorial(int(n))
except ValueError:
print "You must choose a number. Please try again."
return user()
if __name__ == '__main__':
user()
我不明白为什么 user()
函数中的异常似乎没有运行。当我运行此代码时,我得到的只是raw_input“您想使用什么号码?”
。如果存在 ,
。谁能帮我弄清楚为什么会发生(或者更确切地说没有)发生这种情况?factorial()
函数不会运行,我设置的 print
或 return
语句也不会运行值错误
最佳答案
有趣的是,所有代码都在运行!它只是没有显示任何内容,因为 print
语句没有被调用!让我们分解一下用户函数,看看它做了什么。
代码在做什么
n = int(raw_input("What number would you like to use?"))
将用户输入的字符串转换为整数并将其存储到变量中(或者,如果您希望Pythonic-ly正确,则为 name )n
。
try:
factorial(int(n))
尝试(再次)将n
转换为整数并将该整数发送到factorial
函数。注意这里的n
已经是一个整数了!所以这总会成功。只需调用该函数即可,仅此而已。
except ValueError:
print "You must choose a number. Please try again."
return user()
如果引发 ValueError
,则打印一条错误消息,然后返回 user
的值。
无论转换是否成功,我们都不会打印任何内容。我们只运行一个函数然后退出。我们运行什么函数?
def factorial(n):
while n > 0:
return n * factorial(n-1)
return 1
print factorial(n)
请注意,在此函数中,代码表示在返回值后打印一个值。一旦函数返回,return 语句之后就不会执行任何操作。 print
语句不会被执行!所以这个函数正确地计算阶乘(递归地),并返回它。没有别的了!
这就是为什么你的程序看起来什么也不做。这个函数被调用、计算并返回答案。返回的答案将被忽略!
这是什么意思?
代码中有三行关键行定义了它为什么要做它正在做的事情。
- 将用户的输入转换为整数并将其存储在
n
中- 如果用户输入的内容不是整数,则会引发
ValueError
。 - 请注意,这种情况仍然会发生!如果运行代码,输入
b
,然后按 Enter 键,将会引发异常 (ValueError
)。
- 如果用户输入的内容不是整数,则会引发
- 您将
n
转换为整数并将其传递给factorial
。- 虽然它位于
try
block 中(应该如此),但n
已经是一个整数。 这就是为什么你的异常代码永远不会运行。
- 虽然它位于
- 您唯一的打印语句(在从用户处获取有效输入后)位于
factorial
函数内,在 return 语句之后。它永远不会被执行。 这就是为什么没有打印任何内容。- 我不建议在递归函数内打印结果。可以做到,但通常最好在递归函数的外部返回结果并打印返回值。 (也许在用户函数中,调用
factorial(n)
打印它返回的内容会更好!)
- 我不建议在递归函数内打印结果。可以做到,但通常最好在递归函数的外部返回结果并打印返回值。 (也许在用户函数中,调用
我希望这有助于澄清代码到底发生了什么,并且我希望我能够回答您的问题!快乐编码! :D
关于python - 在函数内运行异常 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29325967/