Преобразование типов: когда int(), float(), str() спасают от ошибок и как не потерять данные

В Python у каждого значения есть тип: число, строка, список и т. д. Часто данные приходят «не в том виде», который нужен для операции, — например, число в виде строки из ввода пользователя или CSV‑файла. Тогда используют преобразование типов: int(), float(), str(). В этой статье разберём, когда это необходимо, какие ошибки возникают при неправильном преобразовании и как сохранить данные и избежать сбоев. Всё — с примерами и практическими приёмами.


Почему приходится преобразовывать типы

Основные ситуации:

  • Ввод пользователя. Функция input() всегда возвращает строку, даже если пользователь ввёл цифры.
  • Чтение файлов и CSV. Числа в текстовых файлах — это строки.
  • Работа с API и JSON. Числовые значения могут приходить как строки (например, из‑за особенностей сериализации).
  • Математические операции. Нельзя складывать строку и число: "10" + 5 вызовет ошибку.
  • Форматирование и вывод. Чтобы красиво вывести число, его часто нужно превратить в строку.

Преобразование в целое число: int()

Когда использовать

Когда нужно выполнить целочисленные операции: подсчёт, индексы, количество элементов, идентификаторы (если они действительно целые).

python
age_str = input("Ваш возраст: ")      # строка
age = int(age_str)                    # целое число
print(f"Через год вам будет {age + 1}")

Нюансы и риски

  • int() не принимает дробные числа в виде строки: int("3.14") вызовет ValueError. Сначала нужно через float(): int(float("3.14"))3.
  • Пробелы допускаются, но только по краям: int(" 123 ") работает, а int("12 3") — нет.
  • Поддерживаются разные основания системы счисления (редко, но бывает): int("101", 2)5.

Как не потерять данные при усечении

Преобразование floatint всегда отбрасывает дробную часть (округление «вниз» для положительных чисел):

python
x = 3.99
y = int(x)      # 3

Если важно округление по математическим правилам, используйте round():

python
x = 3.99
y = round(x)    # 4
z = int(round(x))  # тоже 4, если дальше нужно именно int

Преобразование в число с плавающей точкой: float()

Когда использовать

Для измерений, цен, весов, процентов, расчётов с дробной частью.

python
price_str = "199.90"
price = float(price_str)
discount = 0.1
final = price * (1 - discount)
print(final)  # 179.91

Нюансы и риски

  • В разных локалях разделитель дробной части может быть запятой, но float() в Python ожидает точку: float("199,90") вызовет ошибку. Если данные из CSV с запятой, нужно заменить: float("199,90".replace(",", ".")).
  • Очень большие или очень маленькие числа могут привести к OverflowError или стать inf (бесконечность).
  • Точность: float — это двоичная плавающая точка, поэтому возможны небольшие погрешности: 0.1 + 0.2 не всегда точно равно 0.3. Для денег лучше использовать decimal.Decimal.

Пример с Decimal для финансовых расчётов:

python
from decimal import Decimal
 
price = Decimal("199.90")
discount = Decimal("0.1")
final = price * (Decimal(1) - discount)
print(final)  # точное значение без «хвостов»


Преобразование в строку: str()

Когда использовать

  • Для вывода и логирования.
  • Для объединения с другими строками.
  • Для записи в текстовые файлы и JSON.
  • Когда тип данных должен быть строкой (например, ключи в словаре, если логика требует именно строковые ключи).
python
count = 15
message = "Осталось товаров: " + str(count)
print(message)  # Осталось товаров: 15

Удобнее через f‑строки:

python
message = f"Осталось товаров: {count}"

Python сам вызывает str() для подстановки, но понимание этого помогает избегать ошибок при сложной логике.

Нюанс: преобразование сложных объектов

str() работает и для списков, словарей и т. п., но результат — это строковое представление для человека, а не формат для хранения:

python
data = [1, 2, 3]
s = str(data)       # "[1, 2, 3]"
# Это не JSON и не CSV — не стоит парсить обратно через eval()

Для надёжного сохранения/передачи используйте json.dumps() или специализированные сериализаторы.


Обработка ошибок: try/except и валидация

Самая частая ошибка — попытка преобразовать «мусорные» данные:

python
value = "не число"
n = int(value)   # ValueError

Чтобы программа не падала, используют обработку исключений:

python
user_input = input("Введите число: ")
 
try:
    n = int(user_input)
except ValueError:
    print("Это не целое число.")
    n = None

Практический пример: безопасный ввод с повтором

python
while True:
    user_input = input("Введите целое число: ")
    try:
        n = int(user_input)
        break
    except ValueError:
        print("Некорректный ввод. Попробуйте ещё раз.")
 
print("Вы ввели:", n)


Проверка перед преобразованием: str.isdigit() и аналоги

Иногда удобно сначала проверить строку, чтобы избежать исключений:

python
s = "12345"
if s.isdigit():
    n = int(s)
else:
    # обработка ошибки
    pass

Нюансы:

  • isdigit() не работает с отрицательными числами: "-123".isdigit()False.
  • Не работает с дробными: "3.14".isdigit()False.
  • Для отрицательных целых можно проверить так:
python
s = "-123"
if s.lstrip("-").isdigit() and s.count("-") <= 1:
    n = int(s)

Но для сложных случаев лучше полагаться на try/except: он покрывает все варианты и не требует ручной логики.


Практический пример: расчёт суммы из CSV

Допустим, есть строки CSV с ценами, где разделитель — запятая, а дробная часть тоже через запятую:

text
Товар,Цена
Яблоки,120,50
Груши,89,00

Код для безопасного подсчёта:

python
lines = [
    "Яблоки,120,50",
    "Груши,89,00",
]
 
total = 0.0
 
for line in lines:
    parts = line.split(",")
    if len(parts) < 2:
        continue
 
    price_str = parts[1].strip()
    # Заменяем запятую на точку для float
    price_str_fixed = price_str.replace(",", ".")
 
    try:
        price = float(price_str_fixed)
        total += price
    except ValueError:
        # Пропускаем или логируем ошибку
        print(f"Не удалось распарсить цену: {price_str}")
 
print("Общая сумма:", total)

Здесь преобразование спасает от ошибок, а проверка и обработка исключений — от потери данных и аварийного завершения.


Когда что применять

  • Нужно целое число для подсчёта, индексов — int().
  • Нужна дробная часть, измерения, деньги (с осторожностью) — float(). Для денег лучше Decimal.
  • Нужен вывод, объединение, запись в файл — str() или f‑строки.
  • Данные могут быть некорректными — всегда оборачивайте в try/except.
  • Если важна точность и предсказуемость — используйте Decimal вместо float.

Добавить комментарий