В этой статье разберем, какие типы данных существуют в языке программирования Python, чем они отличаются друг от друга и для чего используются. На простых примерах покажем, какие операции можно выполнять с разными типами данных и как применять их на практике.
Что такое и какие бывают типы данных
Типы данных в Python — это классификация, которая определяет, какие значения может хранить переменная или объект, а также какие операции с ними допустимы. Представьте, что кто-то раскладывает вещи по разным коробочкам: в одну — только монетки, в другую — какие-то записки, в третью — набор значков.
В Python типы данных — это как раз такие коробочки: они подсказывают программе, что именно лежит в переменной и что с этим можно делать. Если там число — его можно умножать или делить, если текст — склеивать строки или искать в них слова, а если список — доставать из него отдельные элементы. И самое удобное в Python: вы просто кладете что‑то в переменную, а язык сам решает, к какому типу она относится. Это называется динамической типизацией.
Какие бывают типы данных?
- Числа бывают целыми (тип int), например, при подсчете чашек кофе.
- Для дробных чисел, таких как цена кофе, используется тип float.
- Для комплексных чисел, то есть для чисел с мнимой частью, используется тип complex.
- Текст, будь то имя друга или название аниме, хранится в типе str.
- Для ответов на простые вопросы «да или нет» используется тип bool с вариантами True или False.
- Кроме вышеперечисленного, часто встречаются коллекции:
- Список list — это, например, список покупок, где можно добавлять и убирать пункты.
- Кортеж tuple — похож на список, но его нельзя изменять.
- Множество set — собирает только уникальные элементы без повторов и без строгого порядка.
- Словарь dict — работает как адресная книжка: ключ (например, имя) соответствует значению (номер телефона).
То есть типы данных бывают числовыми (int, float, complex), текстовыми (str), логическими (bool), а остальные типы из вышеприведенного списка — это коллекции. Есть еще специальные типы (NoneType, range и прочие), но о них позже.
Еще типы данных можно классифицировать по их изменяемости. Изменяемые (мутабельные) типы данных — это такие типы данных, которые можно изменять после их создания. К ним относятся списки, словари, множества. Неизменяемые (иммутабельные) типы данных нельзя изменять после их создания. Их можно только создать заново. То есть при попытке изменить объект такого типа (например, увеличить целое число в 2 раза) мы получим новый объект. К таким типам относятся числовые типы, строки, кортежи, логический тип.
Далее рассмотрим каждый тип данных по отдельности.
Тип int
Этот тип представляет собой целые числа, то есть числа без дробной части:
0, 1, −5, 1000 и т. д.
Простой пример:
count_items = 10 level = 5 year = 2024 negative_score = -3
Что с ними можно делать? Тут все как обычно. Их можно умножать, делить, складывать и вычитать:
prod = count_items * 2 div = count_items / 2 add = level + negative_score diff = year - 1990 print(prod) print(div) print(add) print(diff)
В консоли увидим следующее:
20 5.0 2 34
Одним из разновидностей деления в Python является целочисленное деление:
int_div = count_items // 3 print(int_div)
В результате получим число 3, а не 3.3333…, то есть 3.(3). Такие вычисления производят, когда важна только целая часть результата, а дробной частью можно пренебречь. Еще есть деление с остатком. Вот так можно узнать остаток от деления:
rem_div = count_items % 3 print(rem_div)
В консоли получим число 1. Как известно из начального курса математики, это означает, что если нам нужно получить 10 и взять 3 раза по 3, то получится 9. Единички не хватило до 10-и, вот она в остатке и оказалась.
Тип float
Это дробные числа или, по-другому, числа с плавающей точкой:
1.5, 3.14, 0.001 и т.д.
Этот тип данных применяется там, где важна дробная часть, например, при работе с результатами каких-либо измерений или в работе со статистикой, вероятностями и координатами при анализе данных. Пример:
height_m = 1.75 weight_kg = 68.3 tax_rate = 0.2
Здесь, также как и в случае с предыдущим типом, можно выполнять различные арифметические операции, но следует учитывать некоторые особенности:
- При обычном делении чисел в Python результат всегда float:
5 / 2 = 2.5
10 / 5 = 2.0
- Из‑за особенностей хранения дробей в компьютере, могут быть погрешности: 0.1 + 0.2 не всегда ровно 0.3 и это нормально для float. Для финансовых вычислений в серьезных проектах используют специальные типы, но для простых расчетов float вполне годится.
Переходим к следующему типу.
Тип complex
Этот тип нужен для математических вычислений, где есть комплексные числа. Пример:
z1 = 3 + 4j z2 = 1 - 2j
Комплексные числа, помимо прочих действий, можно складывать и вычислять их абсолютную величину:
sum_value = z1 + z2 abs_value_z1 = abs(z1) abs_value_z2 = abs(z2) abs_value_sum = abs(sum_value) print(sum_value) print(abs_value_z1) print(abs_value_z2) print(abs_value_sum)
Результат:
(4+2j) 5.0 2.23606797749979 4.47213595499958
Подробнее о комплексных числах можно прочитать в этой статье.
Тип str
Этот тип работает со строками. Строка — это последовательность символов. В коде ее берут в кавычки: одинарные, двойные или тройные для многострочного текста. Пример:
author = "Льюис Кэрролл" title = 'Приключения Алисы в Стране чудес' description = """В книге рассказывается о девочке по имени Алиса. Алиса через кроличью нору попадает в волшебный мир. В этом мире живут необычные антропоморфные существа. Книга считается одной из лучших в жанре абсурда. В ней много забавных шуток, связанных с математикой, лингвистикой и философией.""" empty = "" # пустая строка
Какие действия можно производить со строками? Например, их можно соединять друг с другом. Это называется конкатенацией:
con_str = author + " написал сказку под названием \"" + title + "\"." print(con_str)
В консоли получим:
Льюис Кэрролл написал сказку под названием "Приключения Алисы в Стране чудес".
Также можно получать символы по их индексу:
letter = author[2] print(letter)
В результате в консоли увидим букву «ю», так как ее индекс равен 2. Не стоит забывать, что индексация символов начинается с нуля. Еще довольно просто можно узнать длину строки:
len_str = len(title) print(len_str)
В консоли будет выведено число 32. Также есть возможность делать срезы строк:
slice_str = description[50:101] print(slice_str)
В итоге будем иметь:
Алиса через кроличью нору попадает в волшебный мир.
Идем дальше!
Тип bool
Этот тип данных может принимать только два возможных значения: True (истина) и False (ложь). Вот так это может выглядеть в коде:
payment_confirmed = True items_packed = True courier_assigned = False
Этот тип очень полезен для проверки различных условий. Для примера возьмем вышеприведенные логические переменные и используем их для программы, которая проверяет готовность заказа к доставке:
order_ready = payment_confirmed and items_packed and courier_assigned
if order_ready:
print("Заказ готов к доставке!")
else:
print("Заказ еще не готов к доставке. Проверьте этапы:")
print(f" Оплата подтверждена: {payment_confirmed}")
print(f" Товары упакованы: {items_packed}")
print(f" Курьер назначен: {courier_assigned}")
С существующими значениями переменных в консоли будет выведено:
Заказ еще не готов к доставке. Проверьте этапы: Оплата подтверждена: True Товары упакованы: True Курьер назначен: False
Подробнее про логические переменные можно прочитать в этой статье.
Тип list
Это тип для списков. Список — это упорядоченная и изменяемая коллекция. Элементы могут быть разных типов, важен порядок элементов, их можно добавлять, удалять и изменять. Простой пример списков:
fruits = ["яблоко", "банан", "апельсин"] scores = [85, 92, 78] mixed = [1, "два", 3.0, True] # так можно, но обычно хранят однотипные данные empty_list = [] # пустой список
Можно легко получить любой элемент из списка по индексу:
element = fruits[1] print(element)
Вывод в консоли будет таким:
банан
Также довольно просто добавлять элементы в список:
fruits.append("груша")
print(fruits)
Результат:
['яблоко', 'банан', 'апельсин', 'груша']
Удаление элементов тоже не представляет каких-либо трудностей:
fruits.remove("банан")
print(fruits)
Вывод:
['яблоко', 'апельсин']
Также, как и в случае со строками, можно делать срезы списков:
slice_list = scores[1:3] print(slice_list)
Получим:
[92, 78]
Подробнее о списках в Python можно прочитать в этой публикации.
Тип tuple
Данный тип предназначен для кортежей. Кортеж — это тот же список, только неизменяемый. После создания нельзя добавить, удалить или изменять элементы. Это дает гарантию, что данные останутся такими, как есть. Пример:
point = (10, 20)
rgb = (255, 128, 0)
window_size = (800, 600)
single = (42,) # запятая обязательна, иначе это просто число в скобках
letters = ("a", "b", "c", "d", "e", "f")
Можно получить любой элемент кортежа по его индексу. Это делается так же, как и со строками:
letter = letters[3] print(letter)
В консоли будет выведена буква d. Зачем нужны кортежи? Вот несколько причин их использования:
- Они могут хранить фиксированные наборы: координаты, размеры окна, цветовые коды.
- Их можно использовать как ключи в словаре. Списки нельзя использовать как ключи, а кортежи можно, так как ключи должны быть неизменяемы.
- Кортежи работают быстрее списков и занимают меньше оперативной памяти.
Тип set
А это тип для множеств. Множество — это неупорядоченная коллекция, которая хранит только уникальные элементы. Пример:
tags = {"python", "gui", "tkinter", "flet", "kivy"}
visited_pages = {1, 3, 5, 7}
В множество можно добавлять элементы:
tags.add("customtkinter")
print(tags)
В консоли получим примерно такой вывод:
{'gui', 'python', 'customtkinter', 'tkinter', 'kivy', 'flet'}
Но так как множество неупорядоченно, то вполне вероятно получить и такой вариант:
{'gui', 'flet', 'tkinter', 'kivy', 'python', 'customtkinter'}
Также достаточно легко удалять элементы из множества:
tags.discard("gui")
print(tags)
Результат:
{'flet', 'tkinter', 'python', 'kivy'}
Множества можно пересекать, объединять и вычислять их разность. Например, объединим 2 вышеприведенных множества:
union_set = tags.union(visited_pages) print(union_set)
Вывод:
{1, 3, 'flet', 5, 7, 'kivy', 'python', 'tkinter', 'gui'}
Подробнее о множествах в языке Python можно прочитать в этой статье.
Тип dict
Это словари. Словарь в Python — это структура данных, которая хранит информацию в виде пар «ключ — значение». Каждый элемент имеет уникальный ключ, с которым связано определенное значение. Простой пример:
user = {"name": "Анна", "age": 35, "city": "Москва"}
settings = {"theme": "dark", "font_size": 14}
movie = {"title": "Ходячий замок", "year": 2004, "rating": 8.4}
Из словаря легко получить значение по ключу:
user_name = user["name"] print(user_name)
Вывод:
Анна
Очень просто добавлять новые значения и изменять уже существующие:
user["age"] = "40" user["country"] = "Россия" print(user)
В консоли получим:
{'name': 'Анна', 'age': '40', 'city': 'Москва', 'country': 'Россия'}
Словари отлично подходят для сохранения данных пользователя, хранения настроек приложений или, например, для записи метаданных фильмов. Подробнее про словари можно прочитать в этой нашей публикации.
Какие еще есть типы данных в Python
Выше мы рассмотрели основные типы данных в языке программирования Python. Помимо уже разобранных, в Python есть и другие типы данных — они решают более узкие или специфические задачи. Коротко пробежимся по некоторым из них:
- Типы bytes и bytearray (байтовые данные) — это не текст, а именно сырые байты — то, что «видит» компьютер на низком уровне: картинки, аудио, сетевые пакеты, файлы.
- Тип NoneType (отсутствие значения) — в Python есть специальное значение None — оно означает «ничего», «еще не задано», «нет результата». Для него выделили отдельный тип NoneType.
- Тип range (диапазон) — это генератор последовательности чисел, который не хранит все числа сразу, а выдает их по запросу.
- Тип frozenset (неизменяемое множество) — это как обычное множество set, но после его создания нельзя добавить, удалить или каким-либо другим способом изменить элементы этого множества.
Помимо этих встроенных типов, в Python есть типы данных из стандартных и сторонних библиотек. Например, в модуле datetime, который входит в стандартную библиотеку Python имеется тип данных представляемый классом date. Он хранит только дату без времени суток. Если необходимо только время суток, тогда пригодится класс time.
Для точных десятичных расчетов существует модуль decimal с классом Decimal. Если производить финансовые вычисления через обычные float, то могут накапливаться ошибки округления. Тип данных Decimal сохраняет значащие цифры и позволяет настраивать режим округления.
Или еще можно привести пример сторонней библиотеки numpy, в которой есть тип данных ndarray. Этот тип нужен для работы с многомерными массивами однородных элементов. Они работают быстрее и используют меньше памяти, чем стандартные списки.
Также в Python имеются пользовательские типы данных. Они создаются самим разработчиком. Простой пример:
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def greet(self) -> str:
return f"Привет! Меня зовут {self.name}. Мне {self.age} лет."
# Создаем экземпляры пользовательского типа Person
helen = Person("Елена", 35)
andrew = Person("Андрей", 40)
print(helen.greet())
print(andrew.greet())
В этом примере создан пользовательский тип Person, у которого есть свои атрибуты name и age и метод greet. В консоли будет выведено:
Привет! Меня зовут Елена. Мне 35 лет. Привет! Меня зовут Андрей. Мне 40 лет.
Проверка и приведение типов
Для проверки типов данных в Python существует функция type. Она работает так: на вход этой функции подаются какие-то данные, а она в ответ возвращает их тип:
print(type(10))
print(type(3.14))
print(type("текст"))
print(type([1, 2]))
print(type((1, 2, 3)))
print(type({1, 2, 3, 4}))
В консоли получим такой вывод:
<class 'int'> <class 'float'> <class 'str'> <class 'list'> <class 'tuple'> <class 'set'>
Иногда приходиться преобразовывать значения из одного типа данных в другой. Такой процесс называется приведением типов. Зачем он нужен? Например, когда пользователь вводит какое-то число, то по умолчанию это всегда строка. Если дальше планируются какие-либо математические операции с этим числом, строку нужно явно преобразовать в число (int или float). Пример:
umber_str = "100000" number_int = int(number_str) print(number_int)
В консоли будет выведено число 100000. Еще пример:
number_str = "10.5" number_float = float(number_str) print(number_float)
Будет выведено число 10.5. Попробуем приведенное к типу float число привести к типу int:
number_str = "10.5" number_float = float(number_str) number_int = int(number_float) print(number_int)
В результате получим число 10, так как приведение к целочисленному типу int отбросило дробную часть. Также можно превращать целочисленный тип в строковый:
int_num = 42 str_num = str(int_num) print(str_num)
Будет выведено число 42. Такое превращение числа в строку может понадобится для того, чтобы объединить число с другим текстом, записать его в файл, отправить по сети или отформатировать.
