Типы данных Python

Встроенные типы данных Python, их проверка и способы преобразования

В Python любые данные являются объектами с определенным классом. Следовательно типы данных являются классами, а переменные — это экземпляры или объекты этих классов.

С помощью функции type() можно определить к какому классу относится переменная:

my_str = 'строка'
my_list = ['один', 'два', 'три']
my_tuple = (1, 2, 3)
my_set = {1, 2, 3}
my_dict = {'Sasha': 35, 'Maxim': 30, 'Ivan': 20}
print(type(my_str))
print(type(my_list))
print(type(my_tuple))
print(type(my_set))
print(type(my_dict))
#<class 'str'>
#<class 'list'>
#<class 'tuple'>
#<class 'set'>
#<class 'dict'>

Динамическая типизация в Python

Так как Python является динамически типизированным языком, то здесь не нужно указывать, к какому типу данных будет относиться переменная.

Тип данных переменной определяется автоматически, во время присваивания значения переменной.

Это дает возможность использовать 1 переменную для разных типов данных. Переменная будет менять свой тип каждый раз, когда ей присваивается новый тип данных:

a = 100
print(type(a))
a = 'Текст'
print(type(a))
a = [1, 2, 3]
print(type(a))
#<class 'int'>
#<class 'str'>
#<class 'list'>

Конечно, сильно увлекаться этим не стоит, для новых данных лучше ввести новую переменную, чтобы потом не запутаться в своем же коде.

Атомарные и структурные типы данных

В Python типы данных делятся на 2 вида: атомарные и ссылочные.

Атомарные типы данных:

Ссылочные типы данных:

Отличия между ними в том, что атомарные типы данных при присваивании переменной, передаются по значению, а ссылочные типы данных при присваивании переменной передаются по ссылке.

Пример:

a = 1
b = a
a = 2
print(a)
print(b)
#2
#1

Здесь наглядно видно, что переменной b было присвоено именно значение переменной a, а не ссылка на область памяти.

Теперь возьмем ссылочный тип данных — список:

my_list = [1, 2, 3]
my_list_2 = my_list
my_list[0] = 0
print(my_list)
print(my_list_2)
#[0, 2, 3]
#[0, 2, 3]

Переменной my_list_2 мы присвоили значение переменной my_list, т.е. список, далее изменили первый элемент списка (под 0 индексом) — это привело к тому, что значение переменной my_list_2 тоже изменилось.
Все потому, что это ссылочные типы данных и, мы передали ссылку на область памяти, а не само значение переменной.

Если нам нужно, чтобы значение в списке не менялось, то следует использовать метод list.copy(), а не присваивание:

my_list = [1, 2, 3]
my_list_2 = my_list.copy()
my_list[0] = 0
print(my_list)
print(my_list_2)
#[0, 2, 3]
#[1, 2, 3]

Основные типы данных Python

К стандартным типам данных в Python относятся:

  • Числа.
  • Строки.
  • Списки.
  • Кортежи.
  • Словари.
  • Множества.

Разберем подробнее каждый тип данных.

Числа

Числовой тип данных представляет из себя:

  • Целые числа
  • Вещественные числа
  • Комплексные числа

Целые числа

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

Целые числа имею тип данных int:

a = 200
b = -34
c = 0
print(type(a))
print(type(b))
print(type(c))
#<class 'int'>
#<class 'int'>
#<class 'int'>

Вещественные числа

Это числа с плавающей точкой, т.е. числа с дробной частью.

Вещественные числа имеют тип данных float:

a = 200.1543
b = -34.0
c = 0.9
print(type(a))
print(type(b))
print(type(c))
#<class 'float'>
#<class 'float'>
#<class 'float'>

Комплексные числа

Эти числа записываются в формате x+yj, где x — действительная часть, а y — мнимая часть числа.

Комплексные числа имеют тип данных complex:

a = 1+2j
print(type(a))
#<class 'complex'>

Этот тип чисел применим в основном в сложных математических вычислениях и редко используется в обычных задачах.

Логический тип данных bool

Этот тип данных имеет только 2 значения: False и True (истина и ложь).

Также стоит заметить, что True и False обязательно пишутся с большой буквы, иначе вы получите ошибку NameError: name ‘true’ is not defined.

print(type(True))
print(type(False))
#<class 'bool'>
#<class 'bool'>

Строки

Строка — неизменяемая упорядоченная последовательность символов.

Строки имеют тип данных str:

my_str = 'текст'
print(type(my_str))
#<class 'str'>

Списки

Список — изменяемая и индексируемая последовательность любых элементов (даже смешанного типа).

Списки имеют тип данных list:

my_list = ['текст', 1, 100, -5.43]
print(type(my_list))
#<class 'list'>

Кортежи

Кортежи — неизменяемая и индексируемая последовательность элементов. В целом кортежи похожи на строки, только здесь нельзя изменять элементы последовательности.

Кортежи имеют тип данных tuple:

my_tuple = ('текст', 1, 100, -5.43)
print(type(my_tuple))
#<class 'tuple'>

Словари

Словари — неупорядоченный набор пар ключ:значение.

Словари имеют тип данных dict:

my_dict = {'ключ1':'значение1', 'ключ2':'значение2', 'ключ3':'значение3'}
print(type(my_dict))
#<class 'dict'>

Множества

Множества — неупорядоченный набор уникальных и неизменяемых элементов.

Множества имеют тип данных dict:

my_set = {1, 2, 3, 4}
print(type(my_set))
#<class 'set'>

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

Преобразование типов данных — это конвертация объекта из одного типа данных в другой.

В Python имеется 2 способа преобразования:

  1. Неявное преобразование типов.
  2. Явное приведение типов.

При неявном преобразовании Python самостоятельно конвертирует тип данных.

Пример:

a = 1
b = 2.2
a = a + b
print(a)
print(type(a))
print(type(b))
#3.2
#<class 'float'>
#<class 'float'>

У нас есть переменная a, которая имеет тип int, т.к. ей присвоено целое число. И есть переменная b с типом данных float.
После того, как мы сложили эти две переменные и эту сумму присвоили переменной a — у нее изменился тип на float.

Python всегда конвертирует меньший по диапазону тип данных в больший, чтобы избежать потери данных.

При явном приведении типов, программист сам меняет тип данных с помощью функций int(), float(), str() и т.д.

Следует помнить, что при преобразовании типа данных функции для приведения типа не изменяет переданное значение, а возвращает новое значение другого типа.

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

Поменяем тип float на int:

a = 10.8
b = int(a)
print(b)
print(type(a))
print(type(b))
#10
#<class 'float'>
#<class 'int'>

Нужно обратить внимание, что здесь не происходит округление числа, а просто отсекается дробная часть.

Преобразовать х в вещественное число: float(x)

Поменяем тип int на float:

a = 15
b = float(a)
print(b)
print(type(a))
print(type(b))
#15.0
#<class 'int'>
#<class 'float'>

Преобразовывать х в строку: str(x)

Поменяем тип int на str:

a = 15
b = str(a)
print(b)
print(type(a))
print(type(b))
#15
#<class 'int'>
#<class 'str'>

Преобразовать s в кортеж: tuple(s)

Поменяем тип str на tuple:

a = 'текст'
b = tuple(a)
print(b)
print(type(a))
print(type(b))
#('т', 'е', 'к', 'с', 'т')
#<class 'str'>
#<class 'tuple'>

Преобразовать s в список: list(s)

Поменяем тип str на list:

a = 'текст'
b = list(a)
print(b)
print(type(a))
print(type(b))
#['т', 'е', 'к', 'с', 'т']
#<class 'str'>
#<class 'list'>

Преобразовать s в словарь: dict(s)

Преобразуем список кортежей list в словарь dict:

a = [(1, 2), (3, 4)]
b = dict(a)
print(b)
print(type(a))
print(type(b))
#{1: 2, 3: 4}
#<class 'list'>
#<class 'dict'>

Содержание: