Чтобы ввести целое число в Python, оберните ввод в int(): age = int(input("Сколько вам лет? ")). Функция input() всегда возвращает строку, даже если человек набрал одни цифры, а int() превращает эту строку в число. Если вместо числа введут «abc» или «2.5», программа упадёт с ошибкой ValueError. Поэтому в любом коде, которым пользуется не только автор, ввод оборачивают в try/except и повторяют вопрос в цикле, пока ответ не подойдёт.
Ниже разбор по шагам: что именно делает int(input()), как читать несколько чисел в одной строке, как проверять ввод и какие ошибки встречаются чаще всего. Весь код запущен в Python 3.14, вывод в блоках настоящий. Если вы только ставите язык, начните с инструкции, как скачать и установить Python, а затем откройте первые простые программы.
Почему 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() получает её и отдаёт целое число.
- Напишите подсказку для человека внутри
input():input("Введите число: "). - Оберните вызов в
int():int(input("Введите число: ")). - Сохраните результат в переменную:
x = int(input("Введите число: ")). - Проверьте тип, если сомневаетесь:
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.
Как ввести несколько чисел в одной строке
Один вызов 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 сделает сам.
Частые ошибки и что с ними делать

Ниже сообщения, которые новички видят чаще всего, когда работают с вводом.
| Сообщение или симптом | Причина | Решение |
|---|---|---|
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-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 011 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




