📖 Теория: кортежи

⚡ Кратко

Кортеж хранит несколько элементов в фиксированном порядке. Он поддерживает индексы, отрицательные индексы, for, len(), in, конкатенацию и повторение, но не поддерживает изменение элементов.

  • (5) — это число, (5,) — кортеж.
  • a, b, c = values работает только если длины совпадают.
  • a, *middle, b = values забирает остаток в список.
  • enumerate(values, start=1) даёт пары (index, value).
  • count() считает повторы, index() ищет первое вхождение.

Что такое кортеж

Кортеж (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, если отсутствие элемента нормально для вашей задачи.