【问题标题】:Collatz sequence. Dealing with exception handling科拉兹序列。处理异常处理
【发布时间】:2021-11-20 10:06:09
【问题描述】:

我刚开始学习 python 3,在尝试理解异常处理时遇到了一些问题。我正在阅读一本教程书,它给了我一个名为“科拉茨序列”的小项目

它本质上是一个程序,通过使用一些简单的数学计算任何整数到“1”。

我已经能够成功地让程序运行,直到用户输入除整数以外的任何内容。起初我得到了 ValueError,它通过使用 除了 ValueError: 得到纠正。

现在我似乎收到 NameError: name 'number' is not defined

感谢任何帮助。只是想了解异常处理。

def collatz(number):
    if number % 2 == 0:
        even_number = number//2
        print(even_number)
        return even_number
    elif number % 2 == 1:
        odd_number = (number * 3 + 1)
        print(odd_number)
        return odd_number

try:
    number = int(input('Enter Number: '))
except ValueError:
    print('Please enter an integer')
while int(number) != 1:
    number = collatz(number)

【问题讨论】:

    标签: python python-3.x exception


    【解决方案1】:

    一种可能性是跟踪是否使用布尔值将整数作为输入给出。考虑下面的(改编的)代码:

    def collatz(number):
        if number % 2 == 0:
            even_number = number//2
            print(even_number)
            return even_number
        elif number % 2 == 1:
            odd_number = (number * 3 + 1)
            print(odd_number)
            return odd_number
    
    # Keep asking for input until the user inputs an integer
    got_integer = False
    while not got_integer:
        try:
            number = int(input('Enter Number: '))
            got_integer = True
        except ValueError:
            print('Please enter an integer')
    
    while int(number) != 1:
        number = collatz(number)
    

    如您所见,我定义了一个布尔变量got_integer。最初,我将其值设置为False。在这个变量定义之后是一个while循环,它会一直执行循环体,直到got_integer的值为True。现在您只需在输入成功时将got_integer 的值设置为True,如果number = int(input('Enter Number: ')) 行的执行成功)。

    【讨论】:

    • 我只是想确保我理解正确。 “while not got_integer”评估为 True。因此,程序能够运行 try 子句。当输入一个整数时,try 块中的 got_integer 然后评估为 True。然后,这会将“while not got_integer”更改为技术上的错误。然后程序可以移动到“while int(number) !=1:” 对吗?只是想确保我得到它。
    • @Mtcvoid 完全正确。我认为这种方法的主要好处是您只能捕获与输入相关的错误。如果您将所有代码放在 try 块中,它将捕获块中生成的 any ValueError,而不仅仅是与输入相关的 ValueError。
    【解决方案2】:

    如果您遇到异常,您必须在 try 块中包含逻辑。 然后你可以在遇到异常时处理它。在您的情况下,您可以在 try 中使用 while 块,如下所示。根据例外情况,您可以在下面处理它们,就像您已经完成的那样。

    def collatz(number):
        if number % 2 == 0:
            even_number = number//2
            print(even_number)
            return even_number
        elif number % 2 == 1:
            odd_number = (number * 3 + 1)
            print(odd_number)
            return odd_number
    
    try:
        number = int(input('Enter Number: '))
        if number != 1:
            number = collatz(number)
    except ValueError:
        print('Please enter an integer')
    

    【讨论】:

    • 这是有道理的。我最初以完全相同的方式设置原始代码,但在 while number =! : .......我忘记了将其与块分开的缩进。谢谢!
    • 如果在需要整数输入之前您需要询问输入,您可以使用标志,但无论哪种情况都更好地处理异常。
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2012-03-04
    • 2011-11-19
    相关资源
    最近更新 更多