Обработка ошибок, которая побуждает пользователя вводить только целое число больше 1 - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь написать функцию 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 () с ошибкой base 10.Поскольку функция input () всегда возвращает строку, и нам нужно проверить, можно ли преобразовать строку в целое число, нам нужна функция int (), но именно в этом и заключается проблема.

Iперепробовал много разных вариантов кода, включая использование цикла for для сканирования входного значения на наличие любых нецелочисленных символов, но он не настолько эффективен и все еще дает сбой.Я также попробовал цикл while, который закончился созданием бесконечного цикла.

Может кто-нибудь помочь?Есть ли лучший способ написать эту функцию?Я действительно ценю это, спасибо!

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018
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}.")

Попробуйте это

0 голосов
/ 22 сентября 2018

Так что я видел это на работе, когда он был опубликован для проверки кода.Я хотел ответить, но мне пришлось ждать, пока я не вернусь домой.Я разбил ваш блок на два блока: один, который получает ввод (я ненавижу избыточный код), и другой, который выполняет проверку и вызывает ввод.Я также добавил четкое сообщение об ошибке для цифр и не цифр.Я отправляю полный код здесь:

# -*-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()
0 голосов
/ 21 сентября 2018

Я думаю, вы делаете вещи слишком сложными.В основном, если кто-то вводит значение, вы сначала передаете его через функцию int(..), и если это не приводит к ошибке, вы проверяете, больше ли оно единицы, поэтому мы можем написать цикл 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(..)ошибка Value, содержимое по-прежнему недействительно, и мы можем даже изменить msg.В случае, если само преобразование не вызывает каких-либо ошибок, мы можем проверить ограничение и снова дать полезное сообщение.

Мы продолжаем делать это до тех пор, пока valid не установится в True, а затем напечатаемзначение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...