在函数中运行异常 - Python

时间:2015-03-29 05:33:07

标签: python function exception

我现在已经学习了大约3个星期的Python,所以我正在做的事情显然非常简单。我已经编写了几个程序来返回某些计算的值,并且我已经成功地在这些程序的函数中使用了异常。我目前正在处理的程序只是为了让我更多地练习编写函数,循环和异常。这是我到目前为止所得到的:

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 "What number would you like to use?"factorial()函数不会运行,如果有print,我设置的returnValueError语句也不会运行。任何人都可以帮我弄清楚为什么会这样(或者更确切地说不是)?

3 个答案:

答案 0 :(得分:1)

有趣的是,所有代码都在运行!它只是没有显示任何内容,因为print语句没有被调用!让我们分解用户功能,看看它是做什么的。

代码正在做什么

n = int(raw_input("What number would you like to use?"))

将用户键入的字符串转换为整数并将其存储到变量中(或者,如果您希望pythonic -ly正确,则为namen

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语句不会被执行!因此,此函数正确计算阶乘(递归),并返回它。没别了!

这就是为什么你的程序似乎什么也不做。这个函数被调用,计算并返回答案。返回的答案完全被忽略了!

这是什么意思?

您的代码中有三个关键行定义了它为什么要做它正在做的事情。

  1. 您将用户的输入转换为整数并将其存储在n
    • 如果用户输入的不是整数,则会引发ValueError
    • 请注意,这仍然会发生!如果您运行代码,请键入b,然后按Enter键,将引发异常(ValueError)。
  2. 您将n转换为整数并将其传递给factorial
    • 虽然这是try块(应该是),但n已经是整数。 这就是您的异常代码永远不会运行的原因。
  3. 您的唯一print语句(在从用户获得有效输入之后)位于factorial函数内,在return语句之后。它永远不会被执行。 这就是没有打印的原因。
    • 我不建议在递归函数中打印结果。它可以完成,但通常最好返回结果并打印递归函数的返回值 outside 。 (也许在用户函数中,而不是调用factorial(n)打印它返回的内容会更好!)
  4. 我希望这有助于澄清代码的确切内容,我希望我能够回答你的问题!快乐的编码! :d

答案 1 :(得分:1)

以下是我的评论扩展为答案。

首先,不要在factorial功能内打印。打印从该函数返回的值:

def factorial(n):
    while n > 0:
        return n * factorial(n-1)
    return 1

>>> factorial(4)
24

接下来,在块的try部分中包装您认为会导致异常的内容。在这种情况下,使用未知用户输入调用int可能会导致异常;在尝试中包装 - 不再。最后,不要对用户输入使用递归。请改用while循环:

def user():
    n=None
    while not n:
        user_int=raw_input("What number would you like to use? ")
        try:
            n=int(user_int)
        except ValueError:
            print "You must choose a number. Please try again."

    print factorial(n)   

if __name__ == '__main__':
    user() 

答案 2 :(得分:0)

首先,您必须print factorial(int(n))才能看到输出, 并删除输入的int转换,

这是我修改后的代码:

def factorial(n):
  2     while n > 0:
  3        return n *factorial(n-1)
  4     return 1
  5     print factorial(n)
  6 
  7 
  8 
  9 
 10 def user():
 11     n = raw_input("What number would you like to use?")
 12 
 13     try:
 14 
 15         print factorial(int(n))
 16     except ValueError:
 17         print "You must choose a number. Please try again."
 18         return user()
 19 
 20 if __name__ == '__main__':
 21     user()

希望这有帮助,