3

Необходимо проверить введенные пользователем данные. Есть такой код на python

while True:
    try:
        input_data = int(input("Введите число: "))
        break
    except ValueError:
        print("Вы ввели не число. Попробуйте снова: ")

Код проверяет, что ввели именно число. А как теперь сделать проверку, чтобы число лежало в диапазоне 10 <= input_data <=50?

jfs
  • 52,361
alex_t
  • 33

4 Answers4

2

Просто выполняйте проверку одну за другой:

def input_int_in_range(start, end):
    while True:
        try:
            n = int(input("Введите число: "))            
        except ValueError:
            print("Вы ввели не число. Попробуйте снова.")    
        else:
            if start <= n < end:
                return n
            print("Введённое число вне диапазона: [%d, %d)" % (start, end))

Пример:

n = input_int_in_range(10, 50 + 1)
jfs
  • 52,361
1

Я, конечно, понимаю, что в python считается нормальным реализовывать через обработку исключений много такого, на что в других языках пишут явные проверки. Философия EAFP и всё такое.

Но проверять с помощью исключений числовой тип - это уже даже для питона лютый изврат.

Делайте так:

while True:
    input_data = input("Введите число: ")
    if not input_data.isnumeric():
        print("Вы ввели не число. Попробуйте снова: ")
    elif not 10 <= int(input_data) <= 50:
        print("Ваше число не диапазоне. Попробуйте снова")
    else:
        print("Число в правильном диапазоне.")
        break
Xander
  • 20,499
  • Ваш код наглядно демонстрирует почему код в вопросе совершенно корректно использует ValueError (вот ответ @Tox это уже перегиб: "выбрасывать и ловить на том же уровне" лучше избегать). Что int принимает и что isnumeric возвращает это разные вещи (подумайте, что isdigit, isdecimal делают для Юникодных строк). – jfs Sep 29 '16 at 14:24
  • Спасибо. Ваш способ рабочий. – alex_t Oct 05 '16 at 09:54
  • 1
    @alex_t: '¾'.isnumeric() возвращает True. Не используйте, isnumeric(), если вы всё равно строку в int() сразу же передаёте (int('¾') выбрасывает ошибку). Можно заплатку ввиде isdecimal(), использовать, но чтобы в тонкости Unicode стандарта не вникать, используйте EAFP подход: сразу передаёте строку в int и обрабатывайте ожидаемые ошибки. – jfs Nov 15 '16 at 21:38
0

У меня получается как-то так

while True:
    try:
        input_data = int(input("Введите число: "))
        if 10 <= input_data <= 50:
            print('OK')
            break
        else:
            raise ValueError
    except ValueError:
        print("Вы ввели не число или число не входит в указанный диапазаон. Попробуйте снова: ")
Tox
  • 71
  • 8
  • Подряд raise ValueError и тут же except ValueError в той же функции—не лучший способ код организовать. – jfs Sep 29 '16 at 14:28
0
def input_(msg):
    input_data = input(msg)
    if not input_data.isdigit(): return input_("Вы ввели не число. Введите число: ")
    if 10 <= int(input_data) <= 50: return input_data
    return input_("Ваше число не диапазоне. Введите число:")
print(input_("Введите число: "))

out:

Введите число: фыв
Вы ввели не число. Введите число: 121
Ваше число не диапазоне. Введите число:22
22
vadim vaduxa
  • 8,897