Кортеж (tuple) в Python - это неизменяемый (immutable) упорядоченный набор значений, которые могут быть разных типов данных. Кортежи очень похожи на списки, но в отличие от них, элементы кортежа не могут быть изменены после создания. Кортежи используются там, где нужно защитить данные от изменения и обеспечить их целостность.
- Пустой кортеж можно создать следующий образом:
- Кортеж можно создать, перечислив его элементы в круглых скобках через запятую, например:
- К элементам кортежа можно обращаться по индексу, как и к элементам списка
- Кортежи поддерживают большинство операций, которые доступны для списков, такие как конкатенация (объединение), повторение, сравнение, нахождение длины и другие:
- Кортежи также поддерживают распаковку, которая позволяет присвоить значения элементов кортежа переменным:
Кортежи удобны для хранения данных, которые не должны быть изменены, например, координаты точки на плоскости или цвета пикселей в изображении. Кроме того, они могут быть использованы для возврата нескольких значений из функции:
- Кортежи можно сравнивать операторами сравнения (>, <, ==, !=, <=, >=) так же, как и любые другие объекты в Python. При сравнении кортежей сравниваются их элементы слева направо, пока не будет найдено различие. Если все элементы одного кортежа меньше или равны элементам другого кортежа, то первый кортеж меньше второго.
Кортежи в Python обычно используются для хранения данных, которые не должны быть изменены, например, в качестве ключей словаря или для передачи нескольких значений из функции. Также кортежи могут быть удобны для хранения данных, которые не должны изменяться, например, географических координат или цветов пикселей в изображении.
Плюсы и минусы кортежей
Плюсы
- Неизменяемость: элементы кортежа не могут быть изменены после создания, что обеспечивает целостность данных и защиту от ошибок при работе с ними.
- Быстродействие: кортежи в Python быстрее, чем списки, так как не требуют дополнительной памяти на хранение дополнительных данных, таких как ссылки на объекты.
- Меньший объем памяти: поскольку кортежи не изменяемы, они могут быть оптимизированы для более эффективного использования памяти.
- Поддержка хранения разнородных данных: элементы кортежа могут быть разных типов данных, что позволяет хранить разнообразные данные в одном объекте.
Минусы
- Ограниченность: в отличие от списков, кортежи не могут быть изменены после создания, что может быть неудобным в случае необходимости добавления или удаления элементов.
- Ограниченная функциональность: кортежи не имеют такого разнообразия методов и функций, как списки, что может ограничивать их использование в некоторых случаях.
- Отсутствие мутабельности: невозможно изменить элемент кортежа напрямую, даже если он сам является изменяемым объектом, таким как список или словарь.
Тонкости работы с кортежами
Создание кортежа с одним элементом: Если нужно создать кортеж с одним элементом, необходимо ставить запятую после него, чтобы Python понимал, что это кортеж:
Передача кортежа в качестве аргументов функции: Можно передать кортеж в качестве аргументов функции с помощью оператора *:
Преобразование списка в кортеж и наоборот: Список можно преобразовать в кортеж с помощью функции tuple(), а кортеж в список с помощью функции list():
Распаковка кортежей в цикле: Можно использовать распаковку кортежей в цикле для удобной обработки данных:
Кортежи как ключи словаря: Кортежи могут использоваться в качестве ключей словаря, если они неизменяемы:
Использование методов кортежей: Кортежи имеют некоторые методы, такие как index() и count(), которые позволяют искать индекс элемента в кортеже и считать количество вхождений элемента соответственно:
Создание кортежа из генератора: Для создания кортежа из генератора можно использовать функцию tuple(): Кортеж можно создать из генератора с помощью функции tuple(). Например:
Стоимость операций
- Доступ к элементу кортежа по индексу: O(1) Доступ к элементу кортежа по индексу имеет постоянную сложность и занимает фиксированное количество времени независимо от размера кортежа.
- Соединение кортежей (конкатенация): O(n) Соединение (конкатенация) двух кортежей требует создания нового кортежа и копирования всех элементов из обоих кортежей в новый кортеж. Сложность операции зависит от размеров кортежей, которые необходимо объединить, и пропорциональна их суммарному размеру.
- Повторение кортежа: O(mn) Повторение кортежа m раз требует создания нового кортежа и копирования всех элементов из исходного кортежа n раз в новый кортеж. Сложность операции зависит от размера исходного кортежа и количества повторений.
- Проверка на вхождение элемента в кортеж: O(n) Проверка на вхождение элемента в кортеж производится путем последовательного сравнения элементов кортежа с искомым элементом. Сложность операции линейна и зависит от размера кортежа.
- Распаковка кортежа: O(1) Распаковка кортежа производится за постоянное время, не зависящее от размера кортежа.
- Создание кортежа: O(n) Создание кортежа требует выделения памяти под все его элементы и копирования значений в новый объект. Сложность операции пропорциональна размеру кортежа.
- Поиск индекса элемента в кортеже: O(n) Поиск индекса элемента в кортеже производится путем последовательного сравнения элементов кортежа с искомым элементом. Сложность операции линейна и зависит от размера кортежа.
- Подсчет количества вхождений элемента в кортеж: O(n) Подсчет количества вхождений элемента в кортеж производится путем последовательного сравнения элементов кортежа с искомым элементом. Сложность операции линейна и зависит от размера кортежа.
Выбор кортежей вместо списков
Вот несколько примеров, когда кортежи могут быть лучшим выбором, чем списки:
- Использование неизменяемых структур данных: Кортежи являются неизменяемыми объектами в Python, что означает, что после создания кортежа его элементы не могут быть изменены. Если данные должны быть защищены от изменений, то использование кортежей может быть более предпочтительным, чем списков.
- Более быстрый доступ к элементам: Так как кортежи являются неизменяемыми объектами, то их элементы могут быть хранены в памяти более компактно и доступ к элементам может быть более быстрым, чем у списков. Кроме того, кортежи могут быть использованы в качестве ключей в словарях, тогда как списки не могут.
- Создание временных структур данных: Кортежи могут быть созданы быстрее, чем списки, поэтому они могут использоваться для временного хранения данных, когда нужно быстро создать их и получить доступ к элементам.
- Обмен значениями: Кортежи могут использоваться для обмена значениями между переменными без использования временной переменной, благодаря возможности распаковки кортежей.
Однако, если нужно изменять данные в структуре или выполнять операции добавления, удаления и сортировки элементов, то следует использовать списки. Также списки могут быть более удобными, когда нужно работать с большими объемами данных или когда необходимо выполнить сложные операции над элементами.
Скопировать код можно из поста на Boosty