错误处理提示用户仅输入大于1的整数

时间:2018-09-21 08:05:09

标签: python python-3.x function error-handling integer

我正在尝试编写一个Python函数,要求输入大于1的整数并返回或打印输入值。

例如,在运行代码时:
错误情况1:
输入大于1:1的整数
输出:请输入一个大于1的数字:

错误情况2:
输入大于1的整数:abc345
输出:请仅输入整数值:

如果只是为了处理错误情况1,这很容易,我们可以使用while循环。但是为了包括非整数输入,我的代码总是崩溃。

这是我的功能:

    def mult_digits():
        x = input("Enter an integer greater than 1: ")    
        while type(x) is not int:
            try:
                while int(x) <= 1:
                    x = input("Please enter a number greater than 1: ")
                    x = int(x)
            except ValueError:
                  x = input("Please enter integer values only: ")
                  x = int(x)       
        print(f"Yes, you have entered {x}.")

我的代码存在的问题是int(“ a”)会导致int()的常量文字以10为底的错误。由于input()函数总是返回一个字符串,并且我们需要检查字符串是否可以转换为整数,因此我们需要int()函数,但这正是问题所在。

我已经尝试了许多不同的代码变体,包括使用for循环扫描输入值中的任何非整数字符,但是效率不高并且仍然崩溃。我还尝试了一个while循环,最终创建了一个无限循环。

有人可以帮忙吗?有没有更好的方法来编写此函数?非常感谢,谢谢!

3 个答案:

答案 0 :(得分:1)

我认为您使事情变得太复杂了。基本上,如果有人输入了一个值,则首先通过int(..)函数将其传递,如果没有错误,则检查该值是否大于1,因此我们可以编写一个while循环,该循环一直迭代直到该值是有效的,例如:

def mult_digits():
    msg = "Enter an integer greater than 1: "
    valid = False
    while not valid:
        x = input(msg)  
        try:
            x = int(x)
        except ValueError:
            msg = "Please enter integer values only: "
        else:
            valid = x > 1
            if not valid:
                msg = "Enter an integer greater than 1: "
    print(f"Yes, you have entered {x}.")

因此,我们只需在while循环中执行 检查(理想情况下,也将其封装在方法中),并且在int(..)引发{{1 }}错误,内容仍然无效,我们甚至可以更改Value。如果转换本身没有引发任何错误,我们可以检查约束,然后再次给出有用的消息。

我们一直这样做,直到将msg设置为valid,然后打印该值。

答案 1 :(得分:1)

def mult_digits():
    x = input("Enter an integer greater than 1: ")
    while True:
        try:
            while int(x) <= 1:
                x = input("Please enter a number greater than 1: ")
                x = int(x)
            if x > 1:
                    break
        except ValueError:
            x = input("Please enter integer values only: ")

    print(f"Yes, you have entered {x}.")

尝试一下

答案 2 :(得分:1)

因此,在将其发布到代码审查时,我在工作时看到了这一点。我想回答我,但必须等到回家。我将您的代码块分为两个块,一个块获取输入(我讨厌冗余代码),另一个块执行检查并要求输入。我还为数字和非数字添加了明确的错误消息。我将在此处发布完整的代码:

# -*-coding: utf-8-*-
# !/usr/bin/python3.6

import sys


def multi_digits():
    digit = get_input()
    x = True

    while x:
        if digit in '23456789':
            print(f'Yes,you have entered {digit}.')
            x = False
        # In elif it looks like int(digit) may throw an error if it isn't a digit but
        # because of the way if statements work this wont happen. The if statement excutes
        # digit.isdigit() first, if it returns false it doesn't care about the second condition so
        # int(digit) only is checked after we confirm digit is actually a digit.
        elif digit.isdigit() and int(digit) <= 1:
            print('Invalid input: Digit was not greater than 1')
            digit = get_input()
        else:
            print('Invalid input: no letters allowed')
            digit = get_input()


def get_input() -> str:
    return input('Enter an integer greater than 1: ')


def main():
    multi_digits()


if __name__ == '__main__':
    main()