Преобразование типов
В прошлом уроке на каждом жетоне стояло клеймо типа, и перебить его нельзя. Но часто нужен жетон другого вида с тем же содержимым. Представьте мастерскую: вы приносите жетон-текст с надписью "5", мастер читает надпись и чеканит новый жетон — число 5. Старый жетон остаётся у вас таким же, каким был.
Зачем это нужно? Число, записанное в кавычках, — это строка, и + склеивает такие значения, а не складывает их. Чтобы получить сумму, строки сначала превращают в числа:
a = "5"
b = "3"
print(a + b) # 53
print(int(a) + int(b)) # 8Давайте разберём пример по строкам:
a = "5"иb = "3"привязывают бирки к двум строкам.print(a + b)склеивает строки и печатает53.int(a)возвращает новое число5, аint(b)— число3.- Сложение двух
intдаёт8, иprintпечатает его.
Функции int, float и str
Преобразование типа записывается как вызов функции с именем нужного типа: int(x), float(x) или str(x). Функция возвращает новый объект нужного типа. Сама переменная x при этом не меняется и ссылается на прежний объект.
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() принимает строку, только если в ней записано целое число. Строку с точкой он не разбирает:
print(int("2.5")) # ✗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() там не нужен.
Частая ошибка
Строку склеили с числом без преобразования:
total = 8
print("Total: " + total) # ✗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 и подпишись на канал — откроются все уроки.