Кортежи в Python — создание, операции, советы

Кортеж — это коллекция неизменяемых объектов Python. Он может содержать элементы любого типа (целые числа, строки, числа с плавающей точкой, списки и т. д.), что делает его гибкой и полезной структурой данных. Кортежи являются частью ядра языка Python и широко используются в проектах.
Создание кортежа
Кортеж создаётся, если поместить запятую-разделённые элементы в скобки ().
t1 = (1, 2, 3, 4)
t2 = ("Make", "Use", "Of")
t3 = (1.2, 5.9, 5.4, 9.3)Элементы кортежа упорядочены и неизменяемы. В кортеже допустимы повторяющиеся значения, и количество элементов может быть любым — даже нулевым. Элементы могут иметь разные типы данных (int, float, str, tuple и т. д.).
Создание пустого кортежа
Пустой кортеж создаётся парой пустых скобок.
emptyTuple = ()Кортеж из одного элемента
Чтобы создать кортеж из одного элемента, после элемента нужно поставить запятую — иначе Python интерпретирует выражение как само значение.
# t1 is a tuple
t1 = ( 3.14, )
print( type(t1) )
# prints
# t2 is not a tuple
t2 = ( 3.14 )
print( type(t2) )
# prints
Важно: функция type() возвращает тип объекта. Без запятой выражение считается скалярным значением (float в примере).
Кортеж с разными типами данных
Элементы кортежа могут иметь разные типы, что даёт гибкость при хранении связанных данных.
tup1 = ( 'MUO', True, 3.9, 56, [1, 2, 3] )
print( tup1 )
# prints
('MUO', True, 3.9, 56, [1, 2, 3])Создание кортежа через конструктор tuple()
Можно создавать кортежи из других итерируемых объектов с помощью tuple(). Это удобно для конвертации списков или других последовательностей.
tup1 = tuple( (1, 2, 3) )
print( tup1 )
# prints
(1, 2, 3)Вложенные кортежи
Кортежи можно вкладывать друг в друга на любую глубину.
tup1 = (1, 2, 3)
tup2 = ( 'Hello', tup1, 45 )
print( tup2 )
# prints
('Hello', (1, 2, 3), 45)Доступ к элементам кортежа
Доступ к элементам осуществляется по индексу в квадратных скобках. Индексация начинается с 0. Поддерживается отрицательная индексация:
- -1 — последний элемент
- -2 — предпоследний и так далее
tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
print( tup1[0] )
print( tup1[5] )
print( tup1[-1] )
print( tup1[-9] )
# prints
M
S
F
MСрезы (slicing)
С помощью оператора : можно получить диапазон элементов. Поддерживаются негативные индексы.
tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
# Prints elements from index 1(included) to index 6(excluded)
print( tup1[1:6] )
# Prints elements from start to index 8(excluded)
print( tup1[:8] )
# Prints elements from index 3(included) to the end
print( tup1[3:] )
# Prints elements from index -4(included) to index -1(excluded)
print( tup1[-4:-1] )
# prints
('A', 'K', 'E', 'U', 'S')
('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O')
('E', 'U', 'S', 'E', 'O', 'F')
('S', 'E', 'O')Проверка наличия элемента
Оператор in позволяет проверить, присутствует ли элемент в кортеже.
tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
if 'M' in tup1:
print("Yes, the element M exists in the tuple")
else:
print("Element not found in the tuple !!")
# prints
Yes, the element M exists in the tupleОбновление кортежей — неизменяемость
Поскольку кортежи неизменяемы, попытка присвоения по индексу вызовет TypeError:
tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
tup1[0] = 'Z'
# Following error is thrown
tup1[0] = 'Z'
TypeError: 'tuple' object does not support item assignmentОднако есть надёжный приём: конвертировать кортеж в список, изменить список и снова преобразовать в кортеж.
Изменение элемента через список
tup1 = ( 1, 2, 3 )
print( "This is the old Tuple: " )
print( tup1 )
temp = list( tup1 )
temp[0] = 4
tup1 = tuple( temp )
print( "This is the Updated Tuple: " )
print( tup1 )
# prints
This is the old Tuple:
(1, 2, 3)
This is the Updated Tuple:
(4, 2, 3)Добавление элементов через список
append() отсутствует у кортежей — для добавления сначала используйте список, затем снова превратите в кортеж.
tup1 = ( 1, 2, 3 )
print( "This is the old Tuple: " )
print( tup1 )
temp = list( tup1 )
temp.append(4)
tup1 = tuple( temp )
print( "This is the Updated Tuple: " )
print( tup1 )
# prints
This is the old Tuple:
(1, 2, 3)
This is the Updated Tuple:
(1, 2, 3, 4)Удаление
Нельзя удалить отдельный элемент кортежа; можно удалить целый кортеж с помощью del:
tup1 = ( 1, 2, 3 )
del tup1Чтобы удалить элемент, снова используйте приём с преобразованием в список и удалением:
tup1 = ( 1, 2, 3 )
print( "This is the old Tuple: " )
print( tup1 )
temp = list( tup1 )
temp.remove(1)
tup1 = tuple( temp )
print( "This is the Updated Tuple: " )
print( tup1 )
# prints
This is the old Tuple:
(1, 2, 3)
This is the Updated Tuple:
(2, 3)Упаковка и распаковка (packing / unpacking)
Упаковка — создание кортежа при присвоении значений; распаковка — присвоение элементов кортежа отдельным переменным.
# Example of packing a tuple
tup1 = ( 1, 2, 3) # Example of unpacking a tuple
tup1 = ( 1, 2, 3 )
( one, two, three ) = tup1
print( one )
print( two )
print( three )
# prints
1
2
3Перебор кортежей
Кортеж итерабелен, поэтому в нём удобно перебирать элементы.
for-цикл
# Looping using for loop
tup1 = ( 1, 2, 3 )
for element in tup1:
print( element )
# prints
1
2
3По индексам
tup1 = ( 1, 2, 3 )
for index in range(len(tup1)):
print( tup1[index] )
# prints
1
2
3Повышение эффективности кода
Из-за неизменяемости кортежи часто обрабатываются быстрее, чем списки, и могут давать небольшое преимущество по памяти при хранении фиксированных наборов данных. Используйте кортежи, если элементы не должны изменяться — это защищает код от случайных изменений.
Важно: производительность зависит от сценария. Для интенсивных модификаций выбирайте список; для фиксированных наборов — кортеж.
Когда использовать кортеж, а когда нет
Когда подходит кортеж:
- Набор значений фиксирован и не должен менятьcя (например, координаты, константы, элементы конфигурации).
- Нужно использовать кортеж как ключ в dict (кортеж хэшируем, список — нет, если все элементы также хэшируемы).
- Нужна небольшая оптимизация скорости/памяти при чтении.
Когда кортеж не подходит:
- Требуются частые модификации, вставки или удаления элементов — выбирайте list.
- Нужна семантика «изменяемого» контейнера (например, очередь или стек).
Альтернативы кортежам
- list — изменяемая последовательность, удобна для динамических операций.
- namedtuple / dataclass — когда нужны именованные поля и читаемость.
- array / numpy.ndarray — для плотного хранения чисел и быстрого векторного вычисления.
Практическая методология работы с кортежами (мини-метод)
- Решите, должны ли данные изменяться. Если да — используйте list.
- Если нужен неизменяемый набор, предпочтите tuple.
- При необходимости модификации: преобразуйте в list, измените, обратно в tuple.
- Для читаемости рассмотрите namedtuple или dataclass.
Чек-лист ролей
Разработчик:
- Использовать кортеж для фиксированных наборов данных.
- Проверять, что вложенные элементы хэшируемы, если кортеж будет ключом dict.
Тестировщик:
- Проверить невозможность изменения кортежа через API.
- Тесты на преобразования tuple <-> list и ожидаемые результаты.
DevOps / инженер качества:
- Убедиться, что сериализация/десериализация кортежей (JSON/Pickle) соответствует требованиям.
Контрпримеры: когда «хак» с list не годится
- Если кортеж хранится в нескольких местах как разделяемый ресурс, преобразование и повторная сборка могут привести к рассинхронизации данных.
- Для больших кортежей частые преобразования в список и обратно будут неэффективны по памяти и времени.
Факто-бокс
- Характер: упорядоченный, неизменяемый контейнер.
- Подходит как ключ dict (если все элементы хэшируемы).
- Используется для упаковки/распаковки значений.
Критерии приёмки
- Кортеж используется только тогда, когда набор данных не должен изменяться.
- Места кода, где применяется преобразование в list и обратно, имеют тесты на корректность.
- Никаких попыток присвоения элементов кортежа по индексу.
Глоссарий (1 строка)
- Кортеж (tuple): неизменяемая упорядоченная коллекция объектов Python.
Примеры тест-кейсов (коротко)
- Попытка изменить элемент кортежа должна приводить к TypeError.
- Преобразование кортежа в список, изменение и обратное преобразование должно давать ожидаемый кортеж.
- Использование кортежа как ключа в dict должно работать при хэшируемых элементах.
Советы по локализации и совместимости
- При сериализации в JSON кортежи превращаются в списки, поэтому при десериализации вы получите list, если не восстановите tuple вручную.
- Для передачи неизменяемых структур через API явное использование tuple может привести к несогласованности, если клиент ожидает список.
Краткое резюме
- Кортежи — отличный выбор для фиксированных наборов данных, когда нужна безопасность от изменений и возможная небольшая оптимизация скорости.
- Для частых изменений используйте list или специализированные структуры.
- Преобразования tuple <-> list — безопасный и распространённый приём, но учитывайте накладные расходы при больших объёмах.
Важно: выбирайте структуру данных, исходя из требований семантики и производительности, а не исходя из привычки.
Похожие материалы
Скачать ISO Windows 11 — 3 простых способа
Как добавить подпись к изображению в PowerPoint
Установка и настройка Nova Launcher на Android
Современный Vim: плагины и настройки
Как исправить звуковые проблемы Nintendo Switch