python - 在函数内运行异常 - Python

标签 python function exception

我已经学习 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() 函数不会运行,我设置的 printreturn 语句也不会运行值错误。谁能帮我弄清楚为什么会发生(或者更确切地说没有)发生这种情况?

最佳答案

有趣的是,所有代码都在运行!它只是没有显示任何内容,因为 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 语句不会被执行!所以这个函数正确地计算阶乘(递归地),并返回它。没有别的了!

这就是为什么你的程序看起来什么也不做。这个函数被调用、计算并返回答案。返回的答案将被忽略!

这是什么意思?

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

  1. 将用户的输入转换为整数并将其存储在n
    • 如果用户输入的内容不是整数,则会引发 ValueError
    • 请注意,这种情况仍然会发生!如果运行代码,输入 b,然后按 Enter 键,将会引发异常 (ValueError)。
  2. 您将n 转换为整数并将其传递给factorial
    • 虽然它位于 try block 中(应该如此),但 n 已经是一个整数。 这就是为什么你的异常代码永远不会运行。
  3. 您唯一的打印语句(在从用户处获取有效输入后)位于 factorial 函数内,在 return 语句之后。它永远不会被执行。 这就是为什么没有打印任何内容。
    • 我不建议在递归函数内打印结果。可以做到,但通常最好在递归函数的外部返回结果并打印返回值。 (也许在用户函数中,调用 factorial(n) 打印它返回的内容会更好!)

我希望这有助于澄清代码到底发生了什么,并且我希望我能够回答您的问题!快乐编码! :D

关于python - 在函数内运行异常 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29325967/

相关文章:

python - 导入 pydrake.multibody.math 时出现导入错误

python - 获取 element.tagName 的问题。使用 Python 和 xml.dom.minidom 解析 XML

Python 请求 lib 与 SSL 版本 3

javascript - JavaScript中变量的范围是什么?

c++ - 递归函数的不同输出

c++ - 调用 current_exception() 时抛出 bad_exception

python - Django "emulate"批量插入/更新/删除时数据库触发行为

c++ - 类按钮需要函数指针

Java 错误 : New exception is thrown in catch block, 原始堆栈跟踪可能丢失

java - 如何使用 Exception.printStackTrace(); 包含时间?