Кортеж — структура данных в программировании¶
Кортеж — упорядоченная, но неизменяемая структура данных, используемая в языках программирования для хранения фиксированного набора элементов. В отличие от массива или списка, элементы кортежа нельзя изменить, добавить или удалить после создания объекта. Кортежи поддерживаются в Python, Haskell, ML, Rust, C# (в виде кортежей и структур), Julia и ряде других языков. В русскоязычной литературе по программированию термин также встречается как «кортеж» (от англ. tuple).
¶История
Понятие кортежа восходит к математической логике и теории множеств, где упорядоченные наборы элементов (n-мерные векторы, координаты точек) описывались как «кортежи» заданной длины. В программировании идея получила развитие в функциональных языках: в ML (1973) и Haskell кортежи стали базовым типом для возврата нескольких значений из функции. В Python конструкция появилась в ранних версиях языка и с тех пор остаётся неизменяемым аналогом списка.
¶Устройство и свойства
Кортеж характеризуется следующими свойствами:
- Упорядоченность — элементы имеют фиксированный порядок, доступ к ним осуществляется по индексу (в Python — начиная с нуля).
- Неизменяемость — после создания структуры её элементы нельзя изменить; попытка присвоения нового значения элементу вызывает ошибку
TypeErrorв Python. - Хетерогенность — в большинстве языков (Python, Haskell) кортеж может содержать элементы разных типов; в строго типизированных языках (Rust, C++) тип элементов фиксируется на этапе компиляции.
- Хешируемость — неизменяемый кортеж может служить ключом словаря или элементом множества, в отличие от изменяемого списка.
- Размер — длина кортежа обычно известна на этапе компиляции или создаётся фиксированной; динамическое изменение размера не предусмотрено.
В Python кортеж создаётся перечислением элементов в круглых скобках или через конструктор tuple():
``python point = (3, 4) name = ("Иван", 25, True) empty = () ``
Доступ к элементам осуществляется по индексу: point[0] вернёт 3. Поддерживается срезание (point[0:1]), распаковка (x, y = point), операции сравнения и конкатенации.
¶Кортеж и список: различия
| Свойство | Кортеж | Список |
|---|---|---|
| Изменяемость | Неизменяемый | Изменяемый |
| Синтаксис | (1, 2, 3) | [1, 2, 3] |
| Производительность | Несколько выше | Несколько ниже |
| Хешируемость | Да | Нет |
| Использование как ключ словаря | Возможно | Невозможно |
| Методы | Ограниченные (count, index) | Многочисленные (append, remove, sort) |
Неизменяемость делает кортеж более безопасным: передача кортежа в функцию гарантирует, что исходные данные не будут изменены. Внутренняя реализация кортежа компактнее списка, поэтому он занимает меньше памяти и создаётся быстрее.
¶Применение
Кортежи используются в нескольких типичных сценариях:
- Возврат нескольких значений из функции — вместо создания объекта-контейнера функция возвращает кортеж, который вызывающая сторона распаковывает.
- Неизменяемые записи — представление координат, дат, параметров конфигурации, где изменение данных не предусмотрено логикой программы.
- Ключи словарей и элементы множеств — благодаря хешируемости кортежи применяются для индексации составных ключей.
- Аргументы функций с переменным числом параметров — в Python конструкция
*argsпередаётся в функцию как кортеж.
¶Кортежи в других языках
- Haskell — кортежи записываются как
(a, b, c), тип —(Int, String, Bool). Длина ограничена (обычно до 62 элементов). - Rust — кортежи создаются как
(1, "hello"), элементы имеют фиксированные типы, доступ по индексу возможен только на этапе компиляции через деструктуризацию. - C# — поддерживаются именованные и безымянные кортежи (
(int, string)), появившиеся в C# 7.0. - Julia — кортежи неизменяемы и могут содержать элементы разных типов, что используется для диспетчеризации функций.
- SQL — конструкция
VALUESв операторахINSERTи подзапросах фактически работает с кортежами.
¶Кортеж в математике и теории типов
В теории типов кортеж — это произведение типов (product type), в отличие от суммы типов (union). Кортеж из элементов типов A и B обозначается A × B, его кардинальность равна произведению кардинальностей множеств. В языках с системой типов, поддерживающей алгебраические типы данных, кортежи тесно связаны с записями (record) и структурами (struct), но в отличие от них не подразумевают именование полей.
Источники:
- Лутц М. «Изучаем Python»
- Марков Д. «Программирование на Python 3»
- Свуш П. «Python. Документация» (docs.python.org)
- «Haskell 2010 Language Report»
- «The Rust Programming Language» (doc.rust-lang.org)
- Страуструп Б. «Принципы и практика использования C++»
