Приведение типов в Python: преобразование типов данных
Приведение типов в Python с примерами: преобразование int, float, str, bool и коллекций. Неявное и явное преобразование, типичные ошибки.
Приведение типов (также называемое преобразованием типов) — это процесс конвертации значения из одного типа данных в другой. Python поддерживает это через набор встроенных функций-конструкторов — int(), float(), str(), bool(), list(), tuple(), set() и другие. Понимание того, когда и как выполнять приведение типов, необходимо для написания корректных и гибких программ на Python.
В этой главе рассматривается:
- Разница между неявным и явным приведением типов
- Все основные встроенные функции приведения типов с рабочими примерами
- Преобразование чисел между системами счисления (
hex,oct,binи обратно) - Преобразование типов коллекций (
list,tuple,set) - Правила истинности/ложности boolean-значений и связанные с ними нюансы
- Распространённые ошибки (
TypeError,ValueError) и способы их избежать
Неявное и явное приведение типов
Python различает два вида преобразования типов.
Неявное приведение типов
Неявное приведение типов происходит автоматически, когда Python необходимо согласовать два совместимых типа в выражении. Вызов функции не требуется — Python автоматически «расширяет» более узкий тип, чтобы избежать потери данных.
Наиболее распространённый случай — смешивание целых чисел и чисел с плавающей точкой в арифметике. Python всегда преобразует целое число в число с плавающей точкой, чтобы результат сохранял дробную часть:
Python не выполняет неявное преобразование между несвязанными типами, такими как string и числа. Попытка выполнить "10" + 5 вызовет TypeError. В таких случаях необходимо явное приведение типов.
Явное приведение типов
Явное приведение типов означает самостоятельный вызов функции-конструктора для преобразования значения:
В остальной части этой главы подробно рассматривается каждая важная функция явного приведения типов.
Числовое приведение типов: int(), float(), complex()
int() — преобразование в целое число
int() принимает целые числа, числа с плавающей точкой, boolean-значения и числовые string. При преобразовании числа с плавающей точкой функция усекает (отбрасывает дробную часть), а не округляет:
# float → int (truncates, does NOT round)
print(int(10.9)) # 10
print(int(-10.9)) # -10
# string → int
print(int("42")) # 42
# bool → int
print(int(True)) # 1
print(int(False)) # 0Обратите внимание, что int(-10.9) возвращает -10, а не -11. Python усекает в сторону нуля, а не в сторону отрицательной бесконечности (для этого используется math.floor()).
float() — преобразование в число с плавающей точкой
float() принимает целые числа, boolean-значения и числовые string (включая "inf" и "nan"):
print(float(10)) # 10.0
print(float("3.14")) # 3.14
print(float(True)) # 1.0
print(float("inf")) # infcomplex() — преобразование в комплексное число
complex() строит комплексное число из вещественной и мнимой частей или из string:
print(complex(3, 4)) # (3+4j)
print(complex("3+4j")) # (3+4j)Приведение типов string: str()
str() преобразует практически любой объект Python в его string-представление. Это удобно для конкатенации и при формировании вывода:
age = 30
message = "I am " + str(age) + " years old."
print(message) # I am 30 years old.
print(str(3.14)) # '3.14'
print(str(True)) # 'True'
print(str(None)) # 'None'Для форматирования чисел внутри string ознакомьтесь с главой о Python f-strings — там описан более удобный подход.
Приведение типов boolean: bool() и истинные/ложные значения
bool() преобразует любое значение в True или False согласно правилам истинности/ложности Python. Запоминание того, какие значения являются ложными, важно, так как условия в операторах if и циклах while неявно используют те же правила.
Ложные значения — все они вычисляются как False:
print(bool(0)) # False — zero integer
print(bool(0.0)) # False — zero float
print(bool("")) # False — empty string
print(bool([])) # False — empty list
print(bool(None)) # False — NoneИстинные значения — всё остальное вычисляется как True:
print(bool(1)) # True
print(bool(-1)) # True — any non-zero number
print(bool("a")) # True
print(bool([0])) # True — a list with one elementРаспространённая ловушка: приведение string к boolean всегда возвращает True, если string не пустая — даже bool("False") даёт True. Чтобы проверить, представляет ли string ложное boolean-значение, необходимо явно сравнить её:
# This is WRONG — bool("False") is True!
user_input = "False"
print(bool(user_input)) # True (non-empty string)
# Correct approach: compare the string
print(user_input.lower() == "true") # FalseПреобразование систем счисления
Разбор целых чисел в других системах счисления с помощью int()
int() принимает необязательный второй аргумент, указывающий систему счисления исходной string. Это позволяет разбирать двоичные, восьмеричные и шестнадцатеричные литералы:
print(int("1010", 2)) # 10 — binary string
print(int("17", 8)) # 15 — octal string
print(int("ff", 16)) # 255 — hexadecimal string
# Pass 0 to auto-detect Python prefix notation
print(int("0b1010", 0)) # 10
print(int("0o17", 0)) # 15
print(int("0xFF", 0)) # 255Преобразование целых чисел в string с указанием системы счисления
Python имеет три встроенные функции, форматирующие целое число в виде string с префиксом системы счисления:
print(bin(10)) # '0b1010'
print(oct(8)) # '0o10'
print(hex(255)) # '0xff'Они возвращают string, а не целые числа. Если нужна string без префикса, используйте срезы: bin(10)[2:] даёт '1010'.
Преобразование типов коллекций
Вы можете выполнять преобразование между list, tuple и set с помощью их функций-конструкторов. Преобразование в set удаляет дубликаты и не сохраняет порядок:
# list → tuple
coords = [10, 20, 30]
print(tuple(coords)) # (10, 20, 30)
# tuple → list
point = (4, 5, 6)
mutable = list(point)
mutable.append(7)
print(mutable) # [4, 5, 6, 7]
# list → set (removes duplicates)
numbers = [1, 2, 2, 3, 3, 3]
unique = set(numbers)
print(unique) # {1, 2, 3}Преобразование string в list разбивает её на отдельные символы:
print(list("hello")) # ['h', 'e', 'l', 'l', 'o']Все числовые и строковые преобразования: краткий справочник
Приведённые ниже примеры демонстрируют полный диапазон числового и строкового приведения типов в одном месте:
Python casting numeric
# Converting an integer to a floating-point number
x = 10
y = float(x)
print(y)
# Converting a floating-point number to an integer
x = 10.5
y = int(x)
print(y)
# Converting a string to an integer
x = "10"
y = int(x)
print(y)
# Converting a string to a floating-point number
x = "10.5"
y = float(x)
print(y)
# Converting an integer to a string
x = 10
y = str(x)
print(y)
# Converting a floating-point number to a string
x = 10.5
y = str(x)
print(y)
# Converting a number to a boolean
x = 0
y = bool(x)
print(y)
x = 10
y = bool(x)
print(y)Распространённые ошибки
TypeError
TypeError возникает, когда вы передаёте тип, который функция не может преобразовать вообще — например, передача list в int():
Python casting unsupported type to int
Вывод:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'ValueError
ValueError возникает, когда тип правильный (например, string), но значение не может быть преобразовано — например, слово, переданное в float():
Python casting string to float
Вывод:
ValueError: could not convert string to float: 'hello'Потеря точности при приведении float к int
Преобразование числа с плавающей точкой в целое число молча усекает дробную часть. Предупреждение не выводится — а для отрицательных чисел поведение может удивить:
Python casting float to int
Вывод:
10Если необходимо округление, используйте round() перед приведением или math.floor() / math.ceil() для явного управления направлением.
Безопасное приведение типов с помощью try/except
Когда программа получает данные из пользовательского ввода, файлов или внешних API, заранее неизвестно, успешно ли выполнится приведение. Используйте блок try/except, чтобы обработать ошибки без аварийного завершения:
Python safe casting with try/except
Вывод:
Conversion failed: invalid literal for int() with base 10: 'hello'
10Этот паттерн особенно полезен при обработке полей форм или строк CSV, где любой столбец может содержать неожиданные данные.