Что такое приведение типов в Python (int, str, float) и почему int("12.5") падает с ошибкой?
Пытаюсь сложить число, которое пришло из input(), с другим числом, но получаю ошибку. Потом попробовал int("12.5") — вылетает ValueError, хотя int(12.9) работает и даёт 12. Совсем не понимаю логику: когда надо приводить типы вручную, а когда Python делает это сам?
2 ответа
Приведение типов (каст) — это превращение значения одного типа в другой. В Python есть встроенные функции-конструкторы: int(), float(), str(), bool() и т.д.
Главная причина твоей первой ошибки: input() всегда возвращает строку, даже если ты ввёл цифры. А "5" + 3 Python сложить не может:
x = input("число: ") # пришло "5" (строка!)
print(int(x) + 3) # 8 — сначала приводим к int
Теперь про загадку int("12.5") vs int(12.9):
int(12.9) # 12 — округляет float ВНИЗ (отбрасывает дробную часть)
int("12") # 12 — парсит строку с целым числом
int("12.5") # ValueError! строку с точкой int парсить не умеет
Разница в том, что при работе со строкой int() ожидает текст, который выглядит ровно как целое число. Точка его ломает. А вот с числом (float) он просто отбрасывает дробь. Чтобы спарсить строку с точкой — приведи сначала к float:
int(float("12.5")) # 12
Неявное приведение Python делает сам в арифметике между числами: 2 + 3.0 даст 5.0 — int молча «повышается» до float. Но между строкой и числом он этого не делает (в отличие от JS) — и правильно, иначе были бы тихие баги.
Про bool(): «пустое» считается False — bool(0), bool(""), bool([]) → False, а почти всё остальное → True (включая bool("0") → True, потому что строка непустая, это частая ловушка!). Чтобы не падать на кривом вводе — оборачивай каст в try/except ValueError.
Уточню про округление, на этом многие спотыкаются: int() НЕ округляет математически, он отбрасывает дробную часть (truncate) в сторону нуля.
int(2.9) # 2, а не 3
int(-2.9) # -2, а не -3
round(2.9) # 3 — вот это уже честное округление
Если нужно именно округлить — бери round(). И помни, что round() использует «банковское» округление к чётному: round(2.5) даёт 2, а не 3. Для денег это часто не то, что хочется — там лучше decimal.Decimal.