Что такое кортеж
Кортеж (tuple) — упорядоченная неизменяемая коллекция. Упорядоченная — значит элементы сохраняют позиции. Неизменяемая — значит после создания нельзя присвоить новое значение по индексу, удалить элемент или добавить элемент внутрь того же объекта.
coordinates = (10, 20)
print(coordinates[0])
print(coordinates[-1])
Создание кортежей
Круглые скобки делают запись наглядной, но ключевой признак кортежа — запятая между значениями.
many_values = (1, 2, 3, "apple", True)
empty_tuple = ()
single_value = (5,)
packed_tuple = 1, 2, 3
print(many_values)
print(empty_tuple)
print(single_value)
print(type(packed_tuple))
(5) Python воспринимает как обычное выражение в скобках. Для кортежа из одного элемента нужна запятая: (5,).
Неизменяемость
Если попробовать заменить элемент кортежа по индексу, Python выдаст TypeError. Чтобы получить другой набор значений, создают новый кортеж.
numbers = (10, 20, 30)
# numbers[1] = 40 # TypeError: 'tuple' object does not support item assignment
updated_numbers = numbers[:1] + (40,) + numbers[2:]
print(updated_numbers)
Операции с кортежами
Многие операции такие же, как у списков и строк: сложение, повторение, проверка наличия, длина и поэлементное сравнение.
left = (1, 2)
right = (3, 4)
print(left + right)
print(left * 3)
print(2 in left)
print(len(left))
print((1, 2, 3) == (1, 2, 4))
Преобразование в tuple и list
tuple() создаёт кортеж из другой коллекции. list() делает обратное преобразование, если нужно изменить элементы.
values = [1, 2, 3]
as_tuple = tuple(values)
as_list = list(as_tuple)
print(as_tuple)
print(type(as_tuple))
print(as_list)
print(type(as_list))
Цикл for с кортежами
Кортеж — итерируемый объект, поэтому его можно перебирать в for точно так же, как список или строку.
scores = (10, 20, 30, 40)
for score in scores:
print(score)
Упаковка и распаковка
Упаковка собирает несколько значений в одну коллекцию. Распаковка присваивает элементы коллекции отдельным переменным.
packed = 1, 2, 3
a, b, c = packed
print(packed)
print(a, b, c)
Количество переменных должно совпадать с количеством элементов, если не используется оператор *.
numbers = (1, 2, 3, 4, 5)
first, *middle, last = numbers
print(first)
print(middle)
print(last)
При распаковке с * остаток попадает в список, даже если исходная коллекция была кортежем.
Распаковка в цикле
Если элементы коллекции сами состоят из нескольких значений, их можно распаковать прямо в заголовке цикла.
pairs = ((1, "apple"), (2, "banana"), (3, "cherry"))
for number, fruit in pairs:
print(f"Число: {number}, Фрукт: {fruit}")
Функция enumerate()
enumerate() добавляет счётчик к итерируемому объекту. Это удобно, когда в цикле нужны и индекс, и значение.
languages = ("Python", "Java", "C++")
for index, language in enumerate(languages, start=1):
print(f"{index}: {language}")
Чтобы увидеть содержимое объекта enumerate напрямую, преобразуйте его в список или кортеж.
fruits = ("apple", "banana", "cherry")
print(tuple(enumerate(fruits)))
Методы кортежа
Из-за неизменяемости у кортежа мало методов: count() и index().
numbers = (10, 20, 30, 20, 40)
print(numbers.count(20))
print(numbers.index(20))
print(numbers.index(20, 2))
index() вызывает ValueError, если значение не найдено. Проверяйте наличие через in, если отсутствие элемента нормально для вашей задачи.