W3docs

Приведение типов в 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— editable, runs on the server

Python не выполняет неявное преобразование между несвязанными типами, такими как string и числа. Попытка выполнить "10" + 5 вызовет TypeError. В таких случаях необходимо явное приведение типов.

Явное приведение типов

Явное приведение типов означает самостоятельный вызов функции-конструктора для преобразования значения:

python— editable, runs on the server

В остальной части этой главы подробно рассматривается каждая важная функция явного приведения типов.

Числовое приведение типов: 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"))   # inf

complex() — преобразование в комплексное число

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

python— editable, runs on the server

Вывод:

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

python— editable, runs on the server

Вывод:

ValueError: could not convert string to float: 'hello'

Потеря точности при приведении float к int

Преобразование числа с плавающей точкой в целое число молча усекает дробную часть. Предупреждение не выводится — а для отрицательных чисел поведение может удивить:

Python casting float to int

python— editable, runs on the server

Вывод:

10

Если необходимо округление, используйте round() перед приведением или math.floor() / math.ceil() для явного управления направлением.

Безопасное приведение типов с помощью try/except

Когда программа получает данные из пользовательского ввода, файлов или внешних API, заранее неизвестно, успешно ли выполнится приведение. Используйте блок try/except, чтобы обработать ошибки без аварийного завершения:

Python safe casting with try/except

python— editable, runs on the server

Вывод:

Conversion failed: invalid literal for int() with base 10: 'hello'
10

Этот паттерн особенно полезен при обработке полей форм или строк CSV, где любой столбец может содержать неожиданные данные.

Практика

Практика
In Python, how does casting take place and what are its functions?
In Python, how does casting take place and what are its functions?
Was this page helpful?