Открыть сервисСервис

Кортеж — структура данных в программировании

Кортеж — упорядоченная, но неизменяемая структура данных, используемая в языках программирования для хранения фиксированного набора элементов. В отличие от массива или списка, элементы кортежа нельзя изменить, добавить или удалить после создания объекта. Кортежи поддерживаются в 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)

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

Применение

Кортежи используются в нескольких типичных сценариях:

  1. Возврат нескольких значений из функции — вместо создания объекта-контейнера функция возвращает кортеж, который вызывающая сторона распаковывает.
  2. Неизменяемые записи — представление координат, дат, параметров конфигурации, где изменение данных не предусмотрено логикой программы.
  3. Ключи словарей и элементы множеств — благодаря хешируемости кортежи применяются для индексации составных ключей.
  4. Аргументы функций с переменным числом параметров — в 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), но в отличие от них не подразумевают именование полей.

Источники:

Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru