Перейти к содержимому
Теория · Переменные и типы · урок 4 из 7

Преобразование типов

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

Зачем это нужно? Число, записанное в кавычках, — это строка, и + склеивает такие значения, а не складывает их. Чтобы получить сумму, строки сначала превращают в числа:

Python
a = "5"
b = "3"
print(a + b)  # 53
print(int(a) + int(b))  # 8

Давайте разберём пример по строкам:

  1. a = "5" и b = "3" привязывают бирки к двум строкам.
  2. print(a + b) склеивает строки и печатает 53.
  3. int(a) возвращает новое число 5, а int(b) — число 3.
  4. Сложение двух int даёт 8, и print печатает его.

Функции int, float и str

Преобразование типа записывается как вызов функции с именем нужного типа: int(x), float(x) или str(x). Функция возвращает новый объект нужного типа. Сама переменная x при этом не меняется и ссылается на прежний объект.

Python
print(int("7") + 1)  # 8
print(float("2.5"))  # 2.5
print(float(3))  # 3.0
print(str(42) + "!")  # 42!
print(int(2.9), int(-2.9))  # 2 -2

Разберём каждую функцию отдельно.

int() — целое число

int("7") читает строку и возвращает число 7, поэтому int("7") + 1 даёт 8.

От дробного числа int() отбрасывает дробную часть, а не округляет. Поэтому int(2.9) — это 2, а int(-2.9) — это -2. На собеседовании любят спрашивать, что вернёт int(-2.9): ответ -2, а не -3.

float() — дробное число

float("2.5") превращает строку в число 2.5. float() принимает и строку с целым числом: float("4") даёт 4.0.

float(3) даёт 3.0: дробное число печатается с точкой, даже если оно целое.

str() — строка

str(42) превращает число в текст "42", и его можно склеить с другой строкой. Поэтому str(42) + "!" печатает 42!.

Когда преобразование не удаётся

int() принимает строку, только если в ней записано целое число. Строку с точкой он не разбирает:

Python
print(int("2.5"))  # ✗
TEXT
ValueError: invalid literal for int() with base 10: '2.5'

Ошибка ValueError означает, что тип аргумента подходит, а значение — нет. Строку int() принимает, но текст "2.5" не похож на целое число. Мастер из нашей картинки не может прочитать такую надпись как целое число, и программа останавливается на этой строке. Мастер работает строго: он не угадывает, что вы имели в виду, и одна лишняя точка уже мешает.

Получить из "2.5" число 2 можно в два шага: int(float("2.5")). Сначала float() даёт 2.5, потом int() отбрасывает дробную часть.

Ввод с клавиатуры

Функция input() читает строку, которую человек вводит с клавиатуры. Она всегда возвращает str, даже если ввели одни цифры. Поэтому перед вычислениями её результат оборачивают в int() или float().

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

Частая ошибка

Строку склеили с числом без преобразования:

Python
total = 8
print("Total: " + total)  # ✗
TEXT
TypeError: can only concatenate str (not "int") to str

+ сам не превращает число в строку: строку можно склеить только со строкой. Ошибка TypeError означает, что операция не подходит для такого сочетания типов. Исправить можно двумя способами:

  • превратить число в текст: "Total: " + str(total);
  • передать значения в print через запятую: print("Total:", total).

Главное

  • int(x), float(x) и str(x) возвращают новый объект нужного типа, а x не меняется.
  • int() от дробного числа отбрасывает дробную часть: int(-2.9) — это -2.
  • int("2.5") даёт ValueError, а "Total: " + 8 — TypeError.
  • input() всегда возвращает строку, поэтому для вычислений её преобразуют в число.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом