Кортежи и распаковка

Кортежи и распаковка

Вы уже умеете работать со списками — изменяемыми последовательностями. Python предоставляет ещё один тип последовательности: кортеж (tuple). Кортеж похож на список, но с одним ключевым отличием — он неизменяем.

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

Кортеж — упорядоченная неизменяемая коллекция. Создаётся в круглых скобках (или без них):

point = (3, 5)
rgb = (255, 128, 0)
empty = ()
single = (42,)   # один элемент — нужна запятая!

# Без скобок (тоже кортеж):
coordinates = 10, 20
print(type(coordinates))   # <class 'tuple'>

Обратите внимание: (42) — это просто число в скобках, а не кортеж. Для кортежа из одного элемента необходима запятая: (42,).

Кортеж vs список

Признакlisttuple
Синтаксис[1, 2, 3](1, 2, 3)
Изменяемостьизменяемыйнеизменяемый
Методымного (append, pop...)только count, index
Использование в dictнельзя (ключом)можно (ключом)
Производительностьчуть медленнеечуть быстрее

Неизменяемость кортежа

После создания кортеж нельзя изменить — нельзя добавить, удалить или заменить элемент:

point = (3, 5)
# point[0] = 10   # TypeError: 'tuple' object does not support item assignment
# point.append(7) # AttributeError: 'tuple' object has no attribute 'append'

Если нужна изменяемая версия — конвертируйте в список: list(point).

Индексы и срезы

Кортежи поддерживают те же операции чтения, что и списки:

t = (10, 20, 30, 40, 50)

print(t[0])    # 10
print(t[-1])   # 50
print(t[1:4])  # (20, 30, 40)
print(t[::-1]) # (50, 40, 30, 20, 10)

for elem in t:
    print(elem)

print(30 in t)   # True

Когда использовать кортеж

Кортеж уместен, когда:

  1. Данные не должны изменяться — координаты точки, RGB-цвет, константы.
  2. Возврат нескольких значений из функции — функции часто возвращают кортеж.
  3. Ключ словаря — словари требуют неизменяемые ключи; кортеж можно использовать как ключ.
  4. Именованные поля — для структур данных (мы разберём namedtuple позже).
# RGB цвет — не должен случайно измениться
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# Возврат двух значений:
def min_max(numbers):
    return min(numbers), max(numbers)   # возвращает кортеж

result = min_max([3, 1, 7, 2, 9])
print(result)   # (1, 9)

Распаковка (unpacking)

Распаковка — это присваивание элементов кортежа (или любой последовательности) нескольким переменным одновременно:

point = (3, 5)
x, y = point
print(x)   # 3
print(y)   # 5

r, g, b = (255, 128, 0)
print(r, g, b)   # 255 128 0

Количество переменных слева должно совпадать с количеством элементов. Иначе — ValueError.

Расширенная распаковка со звёздочкой

Оператор * позволяет захватить «остаток» в список:

first, *rest = [1, 2, 3, 4, 5]
print(first)   # 1
print(rest)    # [2, 3, 4, 5]

*start, last = [1, 2, 3, 4, 5]
print(start)   # [1, 2, 3, 4]
print(last)    # 5

a, *middle, z = [1, 2, 3, 4, 5]
print(a)       # 1
print(middle)  # [2, 3, 4]
print(z)       # 5

Swap двух переменных

Вы уже видели это в модуле 1, но теперь понятно механика: Python создаёт кортеж из правой части, затем распаковывает его:

a, b = 10, 20
a, b = b, a   # правая часть: кортеж (b, a) = (20, 10), затем распаковка
print(a, b)   # 20 10

Распаковка в цикле for

pairs = [(1, "a"), (2, "b"), (3, "c")]

for num, char in pairs:
    print(f"{num}: {char}")
# 1: a
# 2: b
# 3: c

Это мы уже делали с enumerate() — оно как раз возвращает кортежи (index, value).

Конвертация между tuple и list

t = (1, 2, 3)
lst = list(t)   # tuple → list
lst.append(4)
t2 = tuple(lst)   # list → tuple
print(t2)   # (1, 2, 3, 4)

Проверь себя

Что выведет следующий код?

a, b, c = "xyz"
print(a, c)

Строка — это последовательность символов. Распаковка a, b, c = "xyz" даёт a='x', b='y', c='z'. Вывод: x z.

Итог

  • Кортеж (tuple) — упорядоченная неизменяемая последовательность в круглых скобках.
  • Для кортежа из одного элемента нужна запятая: (42,).
  • Поддерживает индексы, срезы, in, for, len — как список, но без изменения.
  • Используйте кортеж для постоянных данных, ключей словарей, возврата нескольких значений из функции.
  • Распаковка: a, b = (1, 2) — элегантный способ назначить переменные из последовательности.
  • *var в распаковке захватывает несколько элементов в список.

В следующем уроке изучим сортировку и поиск элементов в списках.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике