Ввод числа в Python: int(input()), проверка и частые ошибки

Функция input() в Python всегда возвращает строку, поэтому целое число получают записью int(input()).

Разбираем, как ввести одно или несколько чисел, дробь через запятую и как проверить ввод через try/except, чтобы программа не падала на опечатках.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2965 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3619 экспертных мнений Подписаться на Телеграм-канал
Обложка: Ввод числа в Python: int(input()), проверка и частые ошибки

Чтобы ввести целое число в Python, оберните ввод в int(): age = int(input("Сколько вам лет? ")). Функция input() всегда возвращает строку, даже если человек набрал одни цифры, а int() превращает эту строку в число. Если вместо числа введут «abc» или «2.5», программа упадёт с ошибкой ValueError. Поэтому в любом коде, которым пользуется не только автор, ввод оборачивают в try/except и повторяют вопрос в цикле, пока ответ не подойдёт.

Ниже разбор по шагам: что именно делает int(input()), как читать несколько чисел в одной строке, как проверять ввод и какие ошибки встречаются чаще всего. Весь код запущен в Python 3.14, вывод в блоках настоящий. Если вы только ставите язык, начните с инструкции, как скачать и установить Python, а затем откройте первые простые программы.

CheckroiCheckroiПодборка курсов по Python566 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Почему input() возвращает строку

Рой-программист вводит число в терминале на ноутбуке

Клавиатура передаёт программе символы. Python не угадывает, что вы имели в виду: число, дату или имя. По описанию функции в документации, input() читает строку, отрезает перевод строки в конце и возвращает её. Подсказку в скобках функция печатает без переноса, поэтому курсор встаёт сразу после неё.

Вот что получается, если забыть про преобразование:

age = input("Сколько вам лет? ")
print(type(age))
print(age + 1)
Сколько вам лет? 25
<class 'str'>
Traceback (most recent call last):
  File ".../age.py", line 3, in <module>
    print(age + 1)
          ~~~~^~~
TypeError: can only concatenate str (not "int") to str

Переменная age хранит строку «25». Сложить строку с числом Python не может и сообщает об этом через TypeError.

Хуже, когда ошибки нет, а результат неверный. Умножение строки на число склеивает её копии:

Код Ввели Вывод Что произошло
print(input() * 3) 3 333 строка «3» повторена три раза
print(int(input()) * 3) 3 9 число 3 умножено на 3
a, b = input().split()
print(a + b)
2 3 23 склеены две строки
a, b = map(int, input().split())
print(a + b)
2 3 5 сложены два числа

Такую ошибку легко пропустить: программа отработала и что-то напечатала. Если результат подозрительно длинный, первым делом проверьте, превратили ли вы ввод в число.

Как ввести целое число: int(input())

Запись int(input()) читается изнутри наружу. Сначала срабатывает input() и возвращает строку, затем int() получает её и отдаёт целое число.

  1. Напишите подсказку для человека внутри input(): input("Введите число: ").
  2. Оберните вызов в int(): int(input("Введите число: ")).
  3. Сохраните результат в переменную: x = int(input("Введите число: ")).
  4. Проверьте тип, если сомневаетесь: print(type(x)).
x = int(input("Введите число: "))
print(type(x), x * 2)
Введите число: 7
<class 'int'> 14

То же самое можно записать в две строки: сначала raw = input(), потом x = int(raw). Новичкам такой вариант понятнее, а в проверках ниже он ещё и удобнее, потому что исходный текст остаётся в переменной и его можно показать в сообщении об ошибке.

Что int() принимает, а что нет

Правила разбора строки описаны в документации к int(). Строка может начинаться с плюса или минуса, иметь пробелы по краям и одиночные подчёркивания между цифрами. Вот как он ведёт себя на типичных ответах:

Что ввели Результат int()
25 25
« 25 » (пробелы по краям) 25
+7 7
-3 -3
1_000 1000
٣ (арабско-индийская цифра) 3
2.5 ValueError: invalid literal for int() with base 10: '2.5'
abc ValueError
пустая строка (просто Enter) ValueError
0x1A ValueError, но int("0x1A", 16) вернёт 26

Обратите внимание на дробное число. int("2.5") не округляет и не отбрасывает дробную часть, а падает. Если нужно принять дробь и потом взять целую часть, сначала превратите строку во float: int(float("2.5")) даст 2. Второй аргумент int() задаёт систему счисления: int("101", 2) вернёт 5.

Дробные числа: float(input()) и запятая

Для дробей вместо int() берут float(). Здесь русскоязычных пользователей ждёт ловушка: в России дробную часть отделяют запятой, а Python понимает только точку.

float("2,5")
ValueError: could not convert string to float: '2,5'

Решение: заменить запятую на точку до преобразования.

raw = input("Цена: ").strip().replace(",", ".")
try:
    price = float(raw)
except ValueError:
    print("Это не число")
else:
    print("С НДС:", round(price * 1.2, 2))
Цена: 99,90
С НДС: 119.88

Дальше с введёнными числами обычно что-то считают. Если путаетесь в знаках вроде //, % и **, загляните в шпаргалку по операторам Python.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Как ввести несколько чисел в одной строке

Один вызов input() читает одну строку целиком. Чтобы получить из неё несколько чисел, строку режут методом split() по пробелам, а к каждому кусочку применяют int(). Удобнее всего это делает map().

Задача Код Ввод → результат
Два числа в переменные a, b = map(int, input().split()) 3 7 → a = 3, b = 7
Список чисел nums = list(map(int, input().split())) 3 7 11 → [3, 7, 11]
То же генератором списка nums = [int(x) for x in input().split()] 1 2 3 4 5 → [1, 2, 3, 4, 5]
Через запятую с пробелом name, age = input().split(", ") Иван, 25 → «Иван» и «25»

Если чисел меньше, чем переменных слева, Python сообщит об этом прямо:

a, b, c = map(int, input().split())
# ввели: 1 2
ValueError: not enough values to unpack (expected 3, got 2)

Числа на отдельных строках

В учебных задачах часто сначала приходит количество, а затем сами числа, каждое на своей строке. Тогда input() вызывают в цикле нужное число раз:

n = int(input())
nums = [int(input()) for _ in range(n)]
print(sum(nums))
3
10
20
30
60

Ввод, пока не нажмут Enter

Бывает, что заранее неизвестно, сколько чисел введёт человек. Тогда договариваются о сигнале остановки, чаще всего это пустая строка. Цикл читает значения по одному и выходит, как только input() вернул пустоту:

numbers = []
while True:
    raw = input("Число (Enter, чтобы закончить): ").strip()
    if not raw:
        break
    numbers.append(int(raw))

print("Сумма:", sum(numbers), "среднее:", sum(numbers) / len(numbers))
Число (Enter, чтобы закончить): 5
Число (Enter, чтобы закончить): 12
Число (Enter, чтобы закончить): 7
Число (Enter, чтобы закончить): 
Сумма: 24 среднее: 8.0

Проверка if not raw стоит до преобразования: иначе пустая строка попадёт в int() и вызовет ValueError. Если сразу нажать Enter, список останется пустым, и деление на len(numbers) упадёт с ZeroDivisionError. В рабочем коде перед расчётом среднего стоит проверить, что числа вообще есть.

Если данных много и их формат заранее известен, весь поток читают одним вызовом через sys.stdin.read().split(). Так делают в олимпиадных задачах, где важна скорость. Объект sys.stdin описан в документации модуля sys. Готовые задачи на ввод и вывод чисел собраны в подборке 30 задач по Python для начинающих.

Как проверить ввод и не уронить программу

Фильтр пропускает кубики с цифрами и отсеивает кубики с буквами

Пока программой пользуетесь только вы, падение на «abc» не страшно. Но учебный проект, бот или консольная утилита должны переживать опечатки. Для этого в Python есть конструкция try/except.

try, except и else

try:
    age = int(input("Сколько вам лет? "))
except ValueError:
    print("Нужно целое число, например 25")
else:
    print("Через год вам будет", age + 1)
Сколько вам лет? двадцать
Нужно целое число, например 25

Код в try выполняется как обычно. Если внутри возникла ошибка указанного типа, Python пропускает остаток блока и переходит в except. Блок else работает только тогда, когда ошибки не было.

Зачем нужен else, если можно написать print прямо в try? Учебник Python объясняет это так: код в else не попадает под перехват, и вы случайно не спрячете ошибку, которую выбросила не та строка. Оставляйте в try только преобразование, а работу с числом выносите в else или ниже.

Повторный запрос в цикле

Одного сообщения об ошибке мало: человек должен получить шанс исправиться. Для этого проверку заворачивают в бесконечный цикл while True и выходят из него через break, когда ответ подошёл. Тот же приём приводит учебник Python в разделе об исключениях.

while True:
    raw = input("Сколько вам лет? ")
    try:
        age = int(raw)
    except ValueError:
        print(f"«{raw}» не похоже на целое число, попробуйте ещё раз")
        continue
    if 0 < age < 120:
        break
    print("Возраст должен быть от 1 до 119")

print("Принято:", age)
Сколько вам лет? abc
«abc» не похоже на целое число, попробуйте ещё раз
Сколько вам лет? 2.5
«2.5» не похоже на целое число, попробуйте ещё раз
Сколько вам лет? -4
Возраст должен быть от 1 до 119
Сколько вам лет? 31
Принято: 31

Здесь две проверки подряд. Первая ловит то, что вообще не число. Вторая отсекает число, которое не имеет смысла: отрицательный возраст или 500 лет. Как устроены while, break и continue, подробно разобрано в статье про цикл while в Python.

Если проверка короткая, её результат можно записать в одну строку: status = "взрослый" if age >= 18 else "несовершеннолетний". Как работает такая запись, разбирает статья про тернарный оператор в Python.

Своя функция для ввода числа

Когда программа спрашивает числа в нескольких местах, цикл с проверкой выносят в функцию. Границы передают параметрами:

def ask_int(prompt, low=None, high=None):
    """Спрашивает число, пока не введут целое в нужных границах."""
    while True:
        raw = input(prompt).strip()
        try:
            value = int(raw)
        except ValueError:
            print("Введите целое число цифрами")
            continue
        if low is not None and value < low:
            print(f"Число должно быть не меньше {low}")
        elif high is not None and value > high:
            print(f"Число должно быть не больше {high}")
        else:
            return value


count = ask_int("Сколько билетов? ", low=1, high=10)
print("Билетов:", count)
Сколько билетов?
Введите целое число цифрами
Сколько билетов? 0
Число должно быть не меньше 1
Сколько билетов? 12
Число должно быть не больше 10
Сколько билетов? 3
Билетов: 3

Пустой Enter тоже обработан: int("") выбрасывает ValueError, и функция просто задаёт вопрос заново.

Почему isdigit() не заменяет try

Во многих примерах проверяют строку методом isdigit() до преобразования. Звучит логично, но метод проверяет только одно: состоят ли все символы строки из цифр. Превратится ли она в целое число, он не знает.

Ввод raw.isdigit() int(raw) Итог проверки через isdigit
42 True 42 верно
-5 False -5 отрицательное число отвергнуто зря
« 7» (пробел в начале) False 7 число отвергнуто зря
² (верхний индекс) True ValueError проверка пропустила, программа упала

Последняя строка самая неприятная. По описанию isdigit(), к цифрам относятся и надстрочные символы вроде ², хотя число по основанию 10 из них не собрать. Более строгий метод isdecimal() для ² вернёт False, но минус и пробелы он тоже не пропустит. Надёжнее всего попробовать преобразовать и поймать ValueError: тогда правила проверки совпадают с правилами самого int().

Что ещё может случиться при вводе

Кроме неправильного текста, бывают ситуации, когда текста нет совсем.

  • EOFError. Ввод закончился раньше, чем программа его ждала. Так бывает, если данные подают из файла или онлайн-тренажёр не передал входных данных. Документация прямо говорит, что при достижении конца ввода input() выбрасывает EOFError.
  • KeyboardInterrupt. Человек нажал Ctrl+C, чтобы прервать программу.
  • Пустая строка. Человек нажал Enter, ничего не набрав. Отдельной ошибки здесь нет: input() вернёт "", а int("") даст ValueError.

Первые два случая ловят отдельным except, чтобы программа завершилась с понятным сообщением, а не с трассировкой:

try:
    n = int(input("Сколько строк вывести? "))
except ValueError:
    print("Нужно целое число")
except (EOFError, KeyboardInterrupt):
    print("\nВвод прерван")
else:
    for i in range(n):
        print(i + 1)
Сколько строк вывести?
Ввод прерван

Так выглядит вывод, если входных данных нет совсем: программа завершается одной понятной строкой, без трассировки.

Ввод других типов: да или нет, пароль, аргументы

Для чисел есть int() и float(), но для логического значения такой приём не работает. bool("False") вернёт True, потому что любая непустая строка считается истинной. Ответ «да/нет» сравнивают со списком допустимых вариантов:

answer = input("Продолжить? (да/нет) ").strip().lower()
agree = answer in ("да", "д", "yes", "y")

Ещё два частых случая:

  • Пароль. Обычный input() показывает набранные символы на экране. Для паролей есть модуль getpass: getpass.getpass("Пароль: ") читает строку без отображения.
  • Аргументы командной строки. Если программу запускают из терминала или по расписанию, спрашивать человека не у кого. Параметры передают при запуске, а читают их через модуль argparse. У его аргументов есть параметр type=int, и преобразование с проверкой argparse сделает сам.
Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Частые ошибки и что с ними делать

Рой с лупой находит ошибку в строке кода на мониторе

Ниже сообщения, которые новички видят чаще всего, когда работают с вводом.

Сообщение или симптом Причина Решение
TypeError: can only concatenate str (not "int") to str к строке из input() прибавили число обернуть ввод в int()
Вместо 5 напечатано 23, вместо 9 напечатано 333 строки склеились или размножились превратить каждое значение в число, например через map(int, …)
ValueError: invalid literal for int() with base 10: '2.5' ввели дробь, а ждали целое float() или int(float(raw)), если дробная часть не нужна
ValueError: could not convert string to float: '2,5' дробь через запятую raw.replace(",", ".") до float()
ValueError: not enough values to unpack в строке меньше чисел, чем переменных проверить формат ввода или читать в список
EOFError: EOF when reading a line входные данные закончились проверить, что тренажёр или файл передаёт нужное число строк
NameError: name 'raw_input' is not defined код из учебника по Python 2 в Python 3 вместо raw_input() пишут input()
ValueError: Exceeds the limit (4300 digits) строка длиннее 4 300 цифр с версии 3.11 это защитный лимит, его поднимают через sys.set_int_max_str_digits()

Отдельно про eval(input()). В старых примерах так «автоматически» получали число или список. Но eval() выполняет введённую строку как код Python, то есть человек у клавиатуры может запустить что угодно. Для чисел используйте int() и float(), для списков подойдёт split().

Где освоить Python системно

Ввод и проверка данных встречаются в первой же неделе любого курса по Python, а дальше на них строятся функции, работа с файлами и обработка ошибок. Если хочется пройти язык целиком, с практикой и проверкой домашних заданий, сравните программы в каталоге курсов по Python по цене, длительности и отзывам.

Тем, кто думает о смене профессии, пригодится разбор, как стать Python-разработчиком, и обзор профессии Python-разработчика.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 011 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что значит int(input()) в Python?

Это два вызова подряд. input() читает строку, которую набрал человек, а int() превращает её в целое число. Без int() в переменной окажется строка, и сложение с числом закончится ошибкой TypeError.

Как ввести несколько чисел в одной строке?

Разрежьте строку по пробелам и превратите каждый кусок в число: a, b = map(int, input().split()). Для списка любой длины подойдёт nums = list(map(int, input().split())).

Как сделать, чтобы программа не падала, если ввели буквы?

Оберните преобразование в try/except ValueError и повторяйте вопрос в цикле while True, пока ответ не подойдёт. Полный пример есть в разделе про проверку ввода, а про сам цикл подробно рассказано в статье о цикле while в Python.

Как ввести дробное число через запятую?

Python понимает дробную часть только через точку, поэтому float("2,5") выдаст ValueError. Замените запятую до преобразования: float(input().replace(",", ".")).

Чем input() отличается от raw_input()?

В Python 3 функции raw_input() нет, вызов закончится ошибкой NameError. По PEP 3111 её переименовали в input(), когда выходил Python 3.0. Там же сказано, что инструмент перевода кода на Python 3 заменяет старые вызовы input() на eval(input()).

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!