В 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 вида: атомарные и ссылочные.
Атомарные типы данных:
- числа;
- строки;
- булевы;
- None.
Ссылочные типы данных:
- списки;
- множества;
- кортежи;
- словари;
- функции;
- классы;
Отличия между ними в том, что атомарные типы данных при присваивании переменной, передаются по значению, а ссылочные типы данных при присваивании переменной передаются по ссылке.
Пример:
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 способа преобразования:
- Неявное преобразование типов.
- Явное приведение типов.
При неявном преобразовании 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'>