Кортежи и распаковка
Кортежи и распаковка
Вы уже умеете работать со списками — изменяемыми последовательностями. Python предоставляет ещё один тип последовательности: кортеж (tuple). Кортеж похож на список, но с одним ключевым отличием — он неизменяем.
Что такое кортеж
Кортеж — упорядоченная неизменяемая коллекция. Создаётся в круглых скобках (или без них):
point = (3, 5)
rgb = (255, 128, 0)
empty = ()
single = (42,) # один элемент — нужна запятая!
# Без скобок (тоже кортеж):
coordinates = 10, 20
print(type(coordinates)) # <class 'tuple'>
Обратите внимание: (42) — это просто число в скобках, а не кортеж. Для кортежа из одного элемента необходима запятая: (42,).
Кортеж vs список
| Признак | list | tuple |
|---|---|---|
| Синтаксис | [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
Когда использовать кортеж
Кортеж уместен, когда:
- Данные не должны изменяться — координаты точки, RGB-цвет, константы.
- Возврат нескольких значений из функции — функции часто возвращают кортеж.
- Ключ словаря — словари требуют неизменяемые ключи; кортеж можно использовать как ключ.
- Именованные поля — для структур данных (мы разберём
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в распаковке захватывает несколько элементов в список.
В следующем уроке изучим сортировку и поиск элементов в списках.