Типы данных в Python: Всё, что вы боялись спросить

Типы данных в Python: Всё, что вы боялись спросить

Картинка к публикации: Типы данных в Python: Всё, что вы боялись спросить

Зачем нужны типы данных в Python

Python, бесспорно, один из самых популярных языков программирования в наше время. Но несмотря на свою славу простого и понятного инструмента, который освоит даже «гуманитарий в третьем поколении», Python таит немало сюрпризов для тех, кто только начинает вникать в его нюансы. Один из таких сюрпризов — типы данных. Казалось бы, мелочь, которую многие новички пытаются проигнорировать до последнего. А зря. Именно понимание того, как Python относится к данным и что такое типы данных, спасает в моменты отчаяния от непонятных ошибок и странных багов.

Почему же Python вообще использует разные типы данных? Представьте себе Python как очень пунктуального и педантичного сотрудника почты. Он не просто хаотично бросает конверты в ящики, а сортирует корреспонденцию, раскладывая её строго по назначению: здесь лежат числа, там — строки, отдельно — списки и словари. И если вдруг вы сунете число в ящик со строками — Python немедленно поднимет тревогу, громко жалуясь через Exception, который буквально скажет вам: «Здесь так не принято!»

Но давайте перейдём к сути вопроса. Python называют языком с динамической типизацией, и это вовсе не означает, что он не придает значения типам. Наоборот, типы в Python критически важны, просто язык не требует от разработчика явного указания типа при создании переменных, как это делают более строгие собратья вроде Java или C++. Python заботливо и самостоятельно решает, какого типа ваша переменная на основе её содержимого. Например, вы написали просто «a = 10» — Python уже догадался, что «a» это целое число (int). Написали «b = "десять"»? Python уже знает, что это строка (str), а не число. Выглядит удобно, но именно здесь кроется множество проблем у новичков, которые часто недооценивают важность этих тонкостей.

Попробуем простейший пример. Что будет, если вы попытаетесь сложить число и строку?

a = 10
b = "20"
c = a + b

Python, будучи воспитанным и аккуратным языком, тут же выдаст вам ошибку: «TypeError: unsupported operand type(s) for +: 'int' and 'str'». В переводе с языка Python на человеческий это звучит так: «Извините, я не могу сложить огурцы и яблоки. Вы либо огурцы в яблоки превращайте, либо наоборот, а потом уж складывайте».

Почему важно понимать эту логику? Да потому, что знание типов данных и умение корректно их использовать позволяет избегать подобных ситуаций, экономить массу времени и нервов при разработке и отладке программ. Ошибки типа данных (TypeError) входят в топ-5 наиболее частых проблем начинающих разработчиков, и на форумах можно увидеть тысячи тем с похожими запросами вроде «Что значит ошибка TypeError в Python» или «почему не складываются число и строка Python».

Кроме того, понимание типизации существенно влияет и на производительность вашего кода. Python хоть и умный, но из-за динамической типизации периодически ему приходится «останавливаться и задумываться», какого типа данные перед ним, и что с ними можно делать. В особо «хитрых» случаях неправильное обращение с типами может замедлить программу до уровня улитки, и тогда уже даже шутки про неторопливость Python начинают выглядеть грустно и злободневно.

Так что, господа и дамы разработчики, типы данных — это совсем не мелочь, на которую можно махнуть рукой и сказать «как-нибудь потом разберусь». Именно сейчас, в самом начале изучения Python, стоит потратить немного времени, чтобы понять эту тему раз и навсегда. Поверьте, будущее «вы» скажет вам за это большое спасибо, ведь оно не будет тратить время на мучительные и долгие поиски ошибок и багов в, казалось бы, простых строчках кода.

Далее мы подробно разберём все встроенные и пользовательские типы данных в Python, объясним разницу между ними и покажем наглядные примеры, как работать с типами данных профессионально. И помните — типы данных могут быть скучной темой только в том случае, если скучно её преподнести. В нашем случае этого точно не произойдёт.

Встроенные типы данных Python

Итак, вы уже поняли, почему типы данных в Python — это не скучная формальность, а фундаментальная часть языка, которую нужно знать и уважать. Теперь настало время разобраться с встроенными типами данных Python, теми самыми «родными», без которых ваша программа не сможет нормально существовать и, тем более, работать.

Начнём с чисел — самого очевидного типа данных. В Python всё, что связано с числами, делится на три основные категории: целые числа (int), числа с плавающей точкой (float) и комплексные числа (complex). В принципе, большинству людей достаточно первых двух категорий, но Python — язык щедрый и предусмотрительный, поэтому комплексные числа идут бонусом для тех, кто скучает по математическим олимпиадам в школе.

Целые числа (int) просты и неприхотливы. Они не имеют дробной части и ведут себя ровно так, как числа, с которыми вы имеете дело каждый день: 1, 42, -99 или 2025. Любимый вопрос всех новичков: «чем int отличается от float?». Ответ максимально прост: float умеет хранить дробную часть, а int — нет. Float — это те самые числа с «плавающей точкой», которые позволяют Python аккуратно справляться с десятичными дробями вроде 3.14, -0.001 или 2.71828. При этом помните: дробные числа Python представляет с ограниченной точностью, так что при расчётах будьте осторожны и не удивляйтесь, если вдруг получите что-то вроде 0.30000000000000004 вместо ожидаемого 0.3. Нет, Python не сошёл с ума — он просто подчиняется законам арифметики с плавающей точкой.

Комплексные числа (complex), состоящие из действительной и мнимой частей, используются реже, в основном в научных расчётах и инженерных задачах. Их легко узнать по наличию буквы «j»: например, 3+4j или -2-7j. Если ваша программа далека от квантовой механики или обработки сигналов, скорее всего, complex числа останутся для вас просто красивой фишкой языка Python, которой можно блеснуть на вечеринке программистов (да-да, такие тоже бывают).

От чисел перейдём к строкам (str), которые в Python можно считать «вторым хлебом». Строки — это текстовые данные, и они всегда записываются в кавычках (одинарных или двойных, Python не привередничает). Запомните, строка "1" и число 1 — это «две большие разницы», как говорили в известном фильме. Первая является текстом, и Python с ней не будет делать никаких арифметических операций. Например, "1" + "1" даст вам "11", а вовсе не 2, потому что Python просто склеит строки. Если вы по ошибке попробуете сложить строку с числом, то получите уже знакомую ошибку TypeError, которая напомнит вам о важности типизации. Так что путать их — плохая идея.

Булевы значения (bool) — ещё один базовый тип, представленный всего двумя значениями: True (истина) и False (ложь). Казалось бы, что может быть проще? Но именно bool управляет логикой практически любой программы, от условных операторов до сложнейших систем управления доступом и авторизацией пользователей. Любой новичок рано или поздно гуглит запрос «как работает bool в Python», хотя ответ лежит на поверхности: True — это истина, False — это ложь, и именно на этой простой бинарной логике держится добрая половина IT-мира.

Теперь перейдём к «особенным гостям». Первым из них будет NoneType, тип данных, содержащий всего одно значение — None. Что такое None? Это специальный объект, обозначающий «ничего», «отсутствие значения». Не путайте None с пустой строкой («») или нулём (0). None — это абсолютно пустой карман, в котором нет ни денег, ни даже дырки. Часто None используется, когда вы ещё не знаете значение переменной или хотите показать, что результат функции отсутствует. Поэтому вопрос «что такое None в Python» неизменно появляется на форумах и Stack Overflow, и теперь вы знаете, как на него ответить.

Ну и напоследок, байты (bytes) — это тип, который вносит в головы новичков определённый хаос. Байты нужны для хранения двоичных данных, которые не подходят под обычные строки, например, изображения, аудиозаписи или файлы в бинарном виде. В Python байты записываются с префиксом «b» перед кавычками: например, b'hello'. Не стоит путать байты и строки: байты не текст, а «сырые данные», и попытка смешать их с обычными строками обычно приводит к очередной ошибке TypeError.

Итак, встроенные типы данных в Python — это базовый набор инструментов, с которым вам придётся сталкиваться ежедневно, независимо от того, пишете ли вы сложнейшие микросервисы, мощные нейронные сети или банальный скрипт для автоматизации рутины. Чем раньше и лучше вы разберётесь в этих фундаментальных кирпичиках языка, тем проще и веселее будет ваша жизнь в мире Python.

В следующей главе мы перейдём к коллекциям данных и узнаем, чем отличаются списки от кортежей, как работают множества и почему коллекции считаются одним из самых полезных и мощных инструментов Python.

Последовательности и коллекции

Настало время поговорить о том, что в Python именуют коллекциями данных — структурах, которые позволяют хранить целые «толпы» значений в одной переменной. Зачем это нужно? Представьте, что вам дали задание хранить сотни отдельных чисел или строк. Если вы создадите для каждого элемента свою переменную, Python, конечно, не обидится, но коллеги-разработчики точно будут смотреть на вас с лёгкой грустью и сочувствием.

Коллекции Python — списки (list), кортежи (tuple) и множества (set) — это не только удобный способ навести порядок в данных, но и отличный инструмент, чтобы произвести впечатление на собеседника. Но хватит лирики — перейдём сразу к делу.

Списки (list) — самая популярная и универсальная коллекция Python, позволяющая хранить любые типы данных, от чисел и строк до сложных объектов и других списков. Python не ограничивает вас в фантазиях: хотите положить в список число, строку и даже функцию одновременно? Пожалуйста! Списки легко узнать по квадратным скобкам: [1, 'два', True]. Главная фишка списка — его изменяемость. В любой момент вы можете добавить, удалить или заменить элементы списка, и Python даже не будет возражать. Это, конечно, здорово, но именно изменяемость часто становится причиной того, что списки начинают вести себя как избалованные подростки: если не следить внимательно за состоянием списка, данные могут внезапно «убежать», оставив вас с неожиданными ошибками и не менее неожиданными багами.

Именно поэтому в Python существуют кортежи (tuple) — этакие «списки-пенсионеры», которые уже наигрались в изменяемость и предпочитают спокойствие и постоянство. Кортежи выглядят почти так же, как списки, только вместо квадратных скобок используются круглые: (1, 'два', True). Их главная особенность — неизменяемость. Создав кортеж, вы не сможете добавить в него элемент или изменить существующие значения. Казалось бы, какая от этого польза? Польза, друзья мои, огромная: кортежи защищают ваши данные от случайных изменений и дают Python дополнительные подсказки для оптимизации кода. Отсюда и ответ на популярный вопрос, который задают поисковикам тысячи новичков: «когда использовать кортеж вместо списка?». Используйте кортежи, если знаете, что данные меняться не будут, например, координаты геолокаций, цвета RGB или месяцы года. Не изменяется — значит, tuple ваш лучший друг.

Ещё одно частое недоумение новичков: «чем список отличается от кортежа помимо изменяемости?». Дело в том, что списки из-за своей гибкости расходуют больше памяти и обрабатываются чуть медленнее, а кортежи, как более скромные и неприхотливые существа, занимают меньше памяти и работают быстрее. Иногда это важно, особенно если вы собираетесь хранить миллионы объектов или боретесь за каждую миллисекунду производительности.

Теперь перейдём к третьему участнику коллекционной вечеринки — множествам (set). Множества — это коллекции без повторяющихся элементов и без порядка. Python заботливо избавляется от любых дубликатов при создании множества, оставляя только уникальные значения. Записываются множества в фигурных скобках: {1, 2, 3}. Не путайте их со словарями — у словарей всегда есть пары ключ-значение, а множества хранят только сами значения.

Если вы когда-нибудь задавались вопросом: «как удалить дубликаты из списка Python?» — множества спешат на помощь:

my_list = [1, 2, 2, 3, 4, 4, 5]
my_set = set(my_list)  # превращаем список в множество
new_list = list(my_set)  # обратно превращаем множество в список 

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

В чём же практическая польза множеств? Помимо удаления дубликатов, множества прекрасно справляются с задачами поиска пересечений, объединений и разницы между группами данных. Скажем, хотите быстро узнать, кто из сотрудников одновременно знает Python и JavaScript — множество сделает это за вас за миллисекунду.

Итак, три кита коллекций в Python — списки, кортежи и множества — каждая структура со своими плюсами и минусами. Списки — универсальные и изменяемые, но требовательные к памяти; кортежи — неизменяемые и лёгкие, идеальны для постоянных данных; множества — незаменимы для работы с уникальными элементами и выполнения математических операций над группами значений.

Зная, когда и какой тип коллекции использовать, вы сможете писать не только красивый, но и максимально эффективный код, экономя ресурсы и собственные нервы. А в следующей главе вас ждёт встреча со словарями — самой «ключевой» коллекцией в Python, которая сделает работу с данными удобной, приятной и по-настоящему профессиональной.

Словари в Python: от простых пар до JSON

Настало время поговорить о структуре данных, которую по праву можно назвать «ключевой» (простите за каламбур) в мире Python — словарях (dict). Без словарей современная разработка на Python превратилась бы в настоящий хаос, потому что именно они помогают нам навести порядок в данных и обеспечивают удобную связь между информацией и её идентификаторами.

Итак, что такое словарь? Словарь — это набор пар ключ-значение, заключённых в фигурные скобки. Если в списках элементы идут строго друг за другом, то в словарях каждый элемент привязан к уникальному ключу, который позволяет моментально получить доступ к нужной информации. Самый простой пример словаря выглядит примерно так:

user = {
    'name': 'Анатолий',
    'age': 42,
    'is_programmer': True
}

Здесь 'name', 'age' и 'is_programmer' — это ключи, а 'Анатолий', 42 и True — это значения, связанные с этими ключами. С помощью ключей вы можете обратиться к любому элементу словаря практически мгновенно, без необходимости перебирать всю коллекцию. Например, если вам нужно имя пользователя, просто напишите user['name'], и Python моментально вернёт вам 'Анатолий'. Никаких лишних поисков и циклов!

«Как работают словари в Python?» — один из наиболее популярных запросов новичков, потому что на первый взгляд это кажется чем-то магическим. На самом деле, магии здесь нет, а есть удобная реализация хеш-таблицы под капотом. Если по-простому, Python использует специальную функцию (хеш-функцию), чтобы преобразовать ключи в уникальные идентификаторы и быстро находить нужное значение. Именно поэтому ключами в словаре могут быть только неизменяемые типы данных — строки, числа, кортежи. А вот изменяемые типы вроде списков использовать в качестве ключей нельзя — Python тут же заявит протест в виде ошибки TypeError.

Словари невероятно полезны в самых разных ситуациях. Например, конфигурационные файлы в проектах на Python — это почти всегда словари. Вместо того, чтобы писать сотни отдельных переменных, можно просто записать настройки проекта в словарь и удобно извлекать их по ключам:

config = {
    'host': 'localhost',
    'port': 5432,
    'use_ssl': False
}

Затем спокойно использовать их в коде, например: config['host'], config['port']. Удобно, понятно, элегантно.

Ещё одна область, где словари стали настоящими героями, — это работа с JSON. JSON (JavaScript Object Notation) — формат обмена данными, который любят и фронтендщики, и бекендщики, и даже менеджеры проектов (хотя последние обычно не знают, что это такое). JSON и словари в Python — практически близнецы-братья, и преобразование между ними — дело нескольких секунд.

Предположим, у вас есть словарь, который нужно превратить в JSON-строку, чтобы передать её куда-то через API. Вот, как это делается буквально двумя строками кода:

import json

user_dict = {
    'username': 'superuser',
    'email': 'superuser@example.com',
    'active': True
}

user_json = json.dumps(user_dict)  # Превратили словарь в JSON 

После этой операции вы получите аккуратную JSON-строку, которую можно отправить хоть на Марс (если там вдруг установили API, поддерживающее JSON).

Обратная операция так же проста: у вас есть JSON-строка, а вам нужен словарь:

json_str = '{"product": "Кофе", "price": 299, "in_stock": true}'
product_dict = json.loads(json_str)  # JSON снова становится словарём 

В результате вы получаете словарь, который тут же можно использовать в коде как обычный Python-объект. И никаких сложных танцев с бубном.

Понимание словарей, ключей и значений — одна из важнейших тем, без которых стать настоящим профи в Python будет очень сложно. Если вы привыкнете грамотно работать со словарями, то сразу почувствуете, насколько чище и эффективнее стал ваш код.

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

Далее мы перейдём от встроенных и базовых коллекций к созданию своих собственных типов данных, используя классы. Узнаем, зачем создавать свои типы, и как с их помощью привести свой код из хаоса к красивому и логичному порядку.

Классы и пользовательские типы данных

После того, как мы детально рассмотрели встроенные типы данных и коллекции Python, приходит время повзрослеть и научиться создавать собственные типы данных с помощью классов. Да-да, именно классы являются тем инструментом, который превращает хаотичный и «лапшевидный» код в аккуратную и поддерживаемую структуру. Если раньше вы довольствовались лишь тем, что придумали создатели языка, то теперь пришло время строить свои «замки», и здесь вам не обойтись без понимания классов и объектно-ориентированного программирования (ООП).

Зачем вообще создавать собственные типы данных, если Python уже дал нам столько готовых вариантов? Ответ прост: встроенные типы подходят далеко не для всех задач. Часто вам нужно объединить в одном объекте несколько разных значений и методов, которые будут с ними работать. Например, у вас есть интернет-магазин, и каждый товар — это отдельная сущность со своими характеристиками: название, цена, количество на складе. Как раз здесь идеальным решением становится создание собственного класса.

Давайте сразу перейдём к практическому примеру и постепенно разберём его по шагам.

Создадим класс Product, который будет представлять товар в нашем интернет-магазине:

class Product:
    def __init__(self, name, price, quantity):
        self.name = name
        self.price = price
        self.quantity = quantity
    
    def total_price(self):
        return self.price * self.quantity

# создаём объект товара
coffee = Product('Кофе', 250, 3)

print(coffee.name)  # Кофе print(coffee.total_price())  # 750 

Теперь разберём этот код подробно.
Первым делом объявляется класс Product, в котором есть специальный метод __init__. Это конструктор — метод, который автоматически вызывается при создании нового объекта. В него мы передаём все необходимые данные: название товара, цену и количество. Эти данные сохраняются внутри объекта с помощью конструкции self.

«Что такое self?» — один из самых популярных вопросов у новичков. Ответ прост и очевиден (хотя и слегка ироничен): self — это ссылка на сам объект, внутри которого мы находимся. Это своеобразное местоимение «я» для объекта класса, с помощью которого он обращается к своим собственным данным.

Также мы добавили метод total_price, который вычисляет общую стоимость товара исходя из цены и количества. Обратите внимание, теперь нам не нужно создавать отдельные функции — данные и логика связаны в одном месте, и это очень удобно.

Теперь давайте немного усложним нашу систему и рассмотрим важнейшие концепции ООП: инкапсуляцию, наследование и полиморфизм.

Инкапсуляция — это защита данных от внешнего вмешательства и «любопытных глаз». Обычно в Python её реализуют при помощи специальных приватных атрибутов, которые обозначаются нижним подчёркиванием. Например, сделаем цену товара приватным атрибутом:

class Product:
    def __init__(self, name, price, quantity):
        self.name = name
        self._price = price  # приватный атрибут
        self.quantity = quantity
    
    def total_price(self):
        return self._price * self.quantity
    
    def set_price(self, new_price):
        if new_price > 0:
            self._price = new_price
        else:
            raise ValueError("Цена не может быть отрицательной!")

product = Product('Чай', 150, 2)
print(product.total_price())  # 300

# Меняем цену безопасно через метод
product.set_price(200)
print(product.total_price())  # 400 

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

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

class DiscountProduct(Product):
    def __init__(self, name, price, quantity, discount):
        super().__init__(name, price, quantity)
        self.discount = discount

    def total_price(self):
        original_price = super().total_price()
        return original_price * (1 - self.discount / 100)

# Применяем наследование
tea = DiscountProduct('Зелёный чай', 300, 4, 10)
print(tea.total_price())  # 1080 

Здесь мы создали класс, который берёт всё самое лучшее от родительского класса и добавляет собственную логику скидок. Метод super() позволяет нам использовать методы родительского класса и избежать дублирования кода.

И наконец, полиморфизм — ещё одна красивая концепция, означающая способность объектов разных классов использовать одинаковый интерфейс. По сути, вы можете обращаться к разным объектам одинаково, а они уже сами решат, как реагировать. Давайте быстро взглянем на пример полиморфизма в действии:

products = [
    Product('Молоко', 60, 5),
    DiscountProduct('Шоколад', 120, 2, 15)
]

for item in products:
    print(f"{item.name}: {item.total_price()} руб.")

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

Таким образом, классы и пользовательские типы данных превращают неструктурированный код в удобную и гибкую систему, в которой легко ориентироваться и ещё проще вносить изменения. Благодаря классам, Python становится не просто языком, на котором пишут программы, а языком, на котором создают настоящие архитектуры приложений, поддерживаемые годами.

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

Мы подошли к финалу нашего погружения в мир типов данных Python. Вы уже знаете, почему типы важны, как использовать встроенные и собственные типы данных, и как классы помогают вам управлять сложностью кода. Но есть одна тема, без которой даже идеально написанный код может рухнуть в самый неподходящий момент, — это приведение типов данных и контроль их корректности. Именно о ней мы и поговорим.

В Python приведение типов — это процесс превращения значения из одного типа в другой. Иногда Python справляется с этим автоматически, например, когда вы делаете простое арифметическое действие с числами разных типов:

result = 10 + 3.5  # int + float автоматически приводится к float print(result)  # 13.5 

Однако в других случаях вам нужно явно указать Python, чего вы от него хотите, чтобы избежать печально известных TypeError. Самый распространённый пример — это преобразование строки в число и наоборот:

age = '30'
real_age = int(age)  # явно приводим строку к числу print(real_age + 5)  # 35 

Зачем это нужно? Представьте ситуацию, когда ваш пользователь вводит данные в форме, и все введённые значения по умолчанию приходят как строки. Без явного приведения типов вы получите либо ошибку, либо, что хуже, неправильный результат, который обнаружится слишком поздно.

Типовые ошибки, такие как TypeError, ValueError или даже AttributeError, почти всегда возникают из-за неправильного обращения с типами данных. Если ваш код пытается умножить строку на число (а вы этого не планировали), Python без церемоний отправит вас к логам искать ошибку:

price = '100 рублей'
total = price * 2  # TypeError: Python не поймёт, что вы от него хотите 

Чтобы таких сюрпризов было меньше, профессионалы пользуются мощными инструментами контроля типов, такими как type hints и современные библиотеки вроде Pydantic.

Type hints — это подсказки Python о том, какой тип данных вы ожидаете увидеть в переменных или функциях. Они помогают не только людям, читающим ваш код, но и специальным инструментам, которые проверяют корректность кода ещё до его запуска:

def calculate_total(price: float, quantity: int) -> float:
    return price * quantity

Теперь Python (и IDE) знает, что ожидать, и если кто-то случайно передаст неправильный тип, IDE мгновенно об этом сообщит.

Но type hints не всегда защищают от ошибок при исполнении программы. Здесь на сцену выходит Pydantic — библиотека, которая не только контролирует типы, но и автоматически преобразует данные, где это возможно:

from pydantic import BaseModel, ValidationError

class Product(BaseModel):
    name: str
    price: float
    quantity: int

# корректные данные
data = {'name': 'Хлеб', 'price': '30.5', 'quantity': '2'}
product = Product(**data)
print(product.price, product.quantity)  # 30.5 и 2 уже приведены к нужным типам

# некорректные данные
bad_data = {'name': 'Масло', 'price': 'тридцать', 'quantity': 'два'}
try:
    bad_product = Product(**bad_data)
except ValidationError as e:
    print(e)  # Pydantic скажет, что именно пошло не так 

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

Теперь, чтобы окончательно закрепить материал, давайте сведём в таблицу один из самых популярных вопросов о типах данных: какие типы в Python изменяемые (mutable), а какие неизменяемые (immutable). Почему это важно? Изменяемые типы могут изменяться прямо на месте, а неизменяемые — нет. Это принципиально влияет на производительность, работу с памятью и то, как Python ведёт себя в различных ситуациях:

Тип данныхИзменяемостьПримерыКогда использовать
Числа (int, float)Неизменяемыеa = 5, b = 3.14В любых числовых операциях (безопасность данных).
Строки (str)Неизменяемыеtext = 'Python'Для текста и любых данных, которые менять не нужно.
Кортежи (tuple)Неизменяемыеpoint = (2, 3)Для хранения неизменных данных, экономии памяти.
Списки (list)Изменяемыеitems = [1, 2, 3]Когда нужно динамически изменять или дополнять наборы данных.
Словари (dict)Изменяемыеuser = {'name': 'Олег'}Для структур хранения данных с быстрым доступом по ключу.
Множества (set)Изменяемыеunique = {1, 2, 3}Для операций с уникальными значениями, удаления дубликатов.
Байты (bytes)Неизменяемыеb = b'byte'Для работы с бинарными данными.

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

В завершение скажем, что знание и правильная работа с типами данных в Python — это не просто необходимая компетенция, а признак профессионализма. Используя грамотное приведение типов, type hints и инструменты вроде Pydantic, вы существенно повысите качество, надёжность и читаемость вашего кода. Поверьте, коллеги и пользователи скажут вам за это огромное человеческое спасибо!


Читайте также:

ChatGPT
Eva
💫 Eva assistant

Выберите способ входа