Ошибка ValueError: когда строку не удаётся превратить в число

Ошибки Pythonобновлено 07.10.20268 мин чтенияесть тренажёр

ValueError в Python — это ошибка неподходящего значения: тип правильный, но содержимое не годится. Чаще всего её видят, когда int() получает строку «абв», дробь «3.5» или пустой ввод. Защититься можно двумя способами: проверить строку методом isdigit() или поймать ошибку конструкцией try/except.

Загружаем…

Что такое ValueError в Python

ValueError в Python — это сигнал «тип подходит, а значение нет». Функция int() умеет работать со строками, но только с теми, которые выглядят как целое число.

Сравните с ошибкой типов. Если передать в функцию значение совсем не того типа, будет TypeError. А здесь функция получила строку, как и положено, начала её разбирать и обнаружила, что внутри не цифры. В официальной документации Python[1] это исключение описано так: оно возникает, когда операция или функция получает аргумент правильного типа, но неподходящего значения. Для школьника это почти всегда означает одно — пользователь ввёл не то, что ожидала программа, или в коде записана строка с лишними символами. В документации Python все встроенные исключения собраны в одну иерархию, и ValueError стоит в ней отдельно от TypeError, хотя новички их часто путают.

В редакторе над статьёй строка «12.5» передаётся в int(). Нажмите «▶ Запустить» и посмотрите на сообщение в окне «Вывод». Затем попробуйте два исправления: заменить int на float или убрать «.5» из строки. Оба варианта уберут неверное значение, но дадут разные ответы.

Сообщение invalid literal for int() with base 10

Фраза invalid literal for int() with base 10 переводится как «неверная запись для int() в десятичной системе». В конце сообщения в кавычках стоит та самая строка, которую не удалось превратить в число.

kolichestvo = int("пять")
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    kolichestvo = int("пять")
                  ~~~^^^^^^^^
ValueError: invalid literal for int() with base 10: 'пять'

Главная подсказка — строка в кавычках в конце. По ней сразу видно, что пришло в функцию: буквы, пробел посередине, запятая или пустота. Если в кавычках ничего нет — '', — значит, пользователь просто нажал Enter, ничего не набрав. Для float() текст другой: «could not convert string to float», но смысл тот же. Дословный текст в документации Python не закреплён, поэтому в разных версиях и в редакторе на сайте он может немного отличаться, однако строка в кавычках будет почти всегда. Слова «base 10» означают десятичную систему; про другие системы счисления можно не думать, пока вы не передаёте в int() второй аргумент.

Дробь в целое: int("3.5")

Строку «3.5» функция int() не принимает — это частая причина ValueError при вводе оценок, роста или цены. Точка для int() такой же посторонний символ, как буква.

Любопытно, что число 3.5 и строка "3.5" ведут себя по-разному. Запись int(3.5) работает и даёт 3: дробная часть просто отбрасывается. А int("3.5") падает. Если нужно принять дробный ввод, используйте float():

rost = float("3.5")
print(rost * 2)
print(int(float("3.5")))

Первая строка вывода — 7.0, вторая — 3. Запись int(float(s)) сначала превращает строку в дробное число, а затем отбрасывает дробную часть. Ещё одна ловушка для русскоязычных школьников — запятая. В тетради мы пишем «3,5», а Python понимает только точку: float("3,5") выдаст ошибку. Если пользователи вводят дробь через запятую, замените её перед преобразованием: float(s.replace(",", ".")). Руководство PEP 8 ничего не говорит о вводе, зато советует давать переменным понятные имена: rost подскажет больше, чем x, когда вы будете искать, откуда пришло неподходящее значение. О разнице между целыми и дробными числами рассказывает урок о типах данных Python.

Пустой ввод, пробелы и буквы

Если пользователь нажал Enter и ничего не ввёл, input() вернёт пустую строку, и int("") выбросит ValueError с пустыми кавычками в конце сообщения.

С пробелами Python обходится мягче, чем можно подумать. Пробелы по краям int() прощает: int(" 12 ") вернёт 12. А вот пробел посередине — нет: int("1 2") упадёт. Знак плюс или минус в начале допустим: int("-7") даёт −7. Буквы, точки, запятые и другие символы внутри — сразу ошибка.

Пустую строку легко поймать заранее: условие if stroka == "": или короче if not stroka: срабатывает, когда пользователь ничего не набрал. Такая проверка не заменяет защиту от букв, но спасает от самого частого случая неверного значения: при тестировании программы Enter нажимают случайно постоянно.

dva_chisla = input("Введите два числа: ")
summa = int(dva_chisla)

Если ввести «4 9», программа упадёт: два числа в одной строке нельзя превратить в одно. Нужно сначала разделить строку методом split(), а потом превратить каждую часть:

a, b = "4 9".split()
print(int(a) + int(b))

Кстати, при такой распаковке тоже бывает ValueError, но с другим текстом: «too many values to unpack» или «not enough values to unpack». Так Python сообщает, что частей после split() оказалось больше или меньше, чем переменных слева. Подробнее о вводе нескольких значений — в статье про функцию input.

Что примет int(), а что нет: таблица

Функция int() принимает строку только из цифр, возможно со знаком и пробелами по краям. Таблица показывает 8 типичных вариантов ввода.

Строкаint()float()
"42"4242.0
" 42 "4242.0
"-7"-7-7.0
"3.5"ошибка3.5
"3,5"ошибкаошибка
"1 2"ошибкаошибка
"пять"ошибкаошибка
"" (пустой ввод)ошибкаошибка

Все результаты можно проверить в редакторе на этой странице: замените строку в программе и нажмите «▶ Запустить».

Миф: «ValueError значит, что в программе ошибка, и её надо переписать». Это не подтверждается: код может быть безупречным, а ошибку вызывает конкретный ввод. Поэтому хорошая программа заранее готовится к неверному значению.

Проверка через isdigit()

Метод isdigit() — это быстрая проверка «состоит ли строка только из цифр». Он возвращает True или False и позволяет не допустить ошибку заранее.

otvet = "15"
if otvet.isdigit():
    print("Число:", int(otvet))
else:
    print("Нужно ввести целое число")

Способ простой и понятный, но с ограничениями. Метод вернёт False для отрицательных чисел, потому что минус — не цифра, для дробей с точкой и для строки с пробелом по краям, хотя int(" 15") справился бы. Пустая строка тоже даёт False, и это удобно. Для задач, где вводят возраст, количество или номер, isdigit() подходит отлично. Если же возможны минус или дробь, лучше воспользоваться следующим способом. Строковые методы подробно разобраны в уроке про строки в Python.

Как поймать ValueError в Python через try/except

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

tekst = "двенадцать"
try:
    chislo = int(tekst)
    print("Удвоенное:", chislo * 2)
except ValueError:
    print("Это не целое число")

Если преобразование удалось, выполняется весь блок try. Если нет — Python сразу прыгает в блок except. Чаще всего это сочетают с циклом, чтобы переспрашивать, пока пользователь не введёт правильно:

while True:
    stroka = input("Сколько тебе лет? ")
    try:
        vozrast = int(stroka)
        break
    except ValueError:
        print("Введите возраст цифрами, например 11")
print("Через 5 лет тебе будет", vozrast + 5)

Конструкция описана в документации Python в разделе об обработке исключений, и освоить её стоит сразу после циклов. Важная деталь: после except стоит указывать тип ошибки. Пустой except: перехватит вообще всё, включая опечатки в именах, и спрячет настоящие проблемы. Как устроен цикл, который повторяется до правильного ответа, показано в уроке про цикл while.

Когда isdigit() не поможет

Проверка isdigit() не поможет, если допустимый ввод содержит не только цифры. Вот 4 случая, когда лучше выбрать try/except.

  • Ввод отрицательных чисел вроде -5. Минус не цифра, и метод вернёт False.
  • Дробь вроде 2.5. Точка не цифра; здесь нужен float() внутри try.
  • Пробел перед числом « 12». int() его простил бы, а проверка — нет.
  • 2 числа в строке. Сначала split(), потом проверка каждой части.

Чего делать нельзя

Нельзя надеяться, что пользователь всегда введёт правильно: любой ввод может оказаться пустым или с буквами. Вот правила.

  • Нельзя писать пустой except: без типа ошибки — он скроет NameError и другие настоящие баги.
  • Не стоит превращать дробный ввод через int() — используйте float().
  • Не следует ожидать запятую в дробях: Python понимает только точку.
  • Нельзя оборачивать в try всю программу — только строку, которая может упасть, и то, что от неё зависит.
  • Не стоит молча подставлять 0 вместо неверного ввода: лучше переспросить пользователя.
  • Не допускается проверять отрицательные числа через isdigit() — метод их отвергнет.

Источники

[1] The Python Tutorial (официальная документация Python 3). Python Software Foundation. — синтаксис и встроенные функции.

[2] ФИПИ. Методические рекомендации для обучающихся по организации индивидуальной подготовки к ОГЭ 2026 года. Информатика. М., 2026.

[3] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования». — информатика 7–9.

Вопросы и ответы

Чем ValueError в Python отличается от TypeError?

TypeError — не тот тип: например, строку складывают с числом. Здесь же тип верный, а содержимое плохое: строка «абв» не похожа на число.

Почему int(3.5) работает, а int("3.5") — нет?

Из числа 3.5 функция просто отбрасывает дробную часть. Строку же она разбирает посимвольно и ожидает только цифры, а точка в этот набор не входит.

Нужно ли ловить ошибки ввода на экзамене?

В задании 16 ОГЭ, по материалам ФИПИ, программу пишут на компьютере[2]. Формат входных данных в таких задачах описан в условии, и главное — прочитать их ровно так, как сказано, не забыв про int().

Можно ли поймать несколько ошибок сразу?

Да: except (ValueError, ZeroDivisionError): перехватит оба типа. Но для начала лучше писать отдельный except для каждого случая и выводить понятное сообщение.

Что значит math domain error?

Это тоже ValueError: например, math.sqrt(-1). Корень из отрицательного числа в обычных числах не существует, и модуль math сообщает о неподходящем значении.

Когда в школе изучают обработку строк?

Федеральная образовательная программа основного общего образования относит обработку строк к 8 классу[3]. Методы isdigit() и split() — удобный способ такой обработки на Python.