Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 11 из 20 Начальный 15 мин 100 XP

Tuple в Python: неизменяемый кортеж и доступ по индексу

Кортеж хранит фиксированный набор значений и защищает его от изменений: создали — и состав застыл. Создание, доступ по индексу, IndexError и то, почему запятая главнее скобок.

Редакция Питоники

Первая половина курса — про множества без порядка. Вторая — про структуры, где порядок есть и застыл: кортежи. Координаты точки, дата как тройка «день, месяц, год», RGB-цвет — наборы, где значения идут парой или тройкой и не имеют права меняться. В уроке 10 была неизменяемость без порядка — frozenset; теперь неизменяемость с порядком.

Создание кортежа

точка и дата
point = (2, 3)
date = (14, 8, 2026)

print(point)
print(len(date))
print(type(point))
Вывод
(2, 3)
3
<class 'tuple'>

Кортеж печатается целиком и в том же порядке, как задан: (2, 3) останется (2, 3) при любом запуске — порядок здесь фиксирован, в отличие от множеств. len считает элементы, type подтверждает тип.

Запятая главнее скобок

один элемент
single = (5,)
number = (5)

print(single)
print(type(number))
print(len(single))
Вывод
(5,)
<class 'int'>
1

Запятая делает кортеж, а не скобки: (5) — это число пять, и только (5,) — кортеж из одного элемента. Скобки служат оформлением для глаз, запятая — смыслом: без неё это просто выражение в скобках, как (2 + 3).

и вовсе без скобок
p = 2, 3

print(p)
print(type(p))
Вывод
(2, 3)
<class 'tuple'>

Python собирает кортеж из значений через запятую даже без скобок. Такой синтаксис встречается у возврата из функций — об этом урок 14.

Доступ по индексу

индексы, срезы, поиск
date = (14, 8, 2026)

print(date[0])
print(date[-1])
print(date[1:])
print(date[0] + date[1])
print(date.index(8))
print(date.count(14))
Вывод
14
2026
(8, 2026)
22
1
1

Индексация как у списков: с нуля, отрицательные — с конца. Срез возвращает новый кортеж с частью элементов, методы index и count ищут по значениям, in проверяет наличие. Границы тоже как у списка: выход за пределы роняет программу:

IndexError на лишнем индексе
date = (14, 8, 2026)
print(date[5])
Вывод
Traceback (most recent call last):
  File "app.py", line 2, in <module>
    print(date[5])
          ~~~~^^^
IndexError: tuple index out of range
Индекса 5 нет: в кортеже три элемента — программа падает так же, как падала бы на списке.

Неизменяемость: главная черта

присваивание по индексу
point = (2, 3)
point[0] = 10
print(point)
Вывод
Traceback (most recent call last):
  File "app.py", line 2, in <module>
    point[0] = 10
    ~~~~~^^^
TypeError: 'tuple' object does not support item assignment
Программа падает на присваивании: ячейки кортежа не переписываются. Ни point[0] = ..., ни append, ни remove у него нет.

Присваивание по индексу запрещено — это и есть неизменяемость: состав кортежа застыл. Что делать, когда значение должно обновиться? Собрать новый кортеж из старого:

новый кортеж из старого
point = (2, 3)
moved = (point[0] + 5, point[1])

print(point)
print(moved)
Вывод
(2, 3)
(7, 3)

Исходник цел, обновлённая версия — отдельный объект. Кортежи склеиваются плюсом и повторяются звёздочкой — тоже создавая новые:

плюс и звёздочка
t = (1, 2)

print(t + (3, 4))
print(t * 2)
Вывод
(1, 2, 3, 4)
(1, 2, 1, 2)

tuple() из последовательности

конструктор tuple
print(tuple([1, 2, 3]))
print(tuple('кот'))
print(tuple(range(3)))
Вывод
(1, 2, 3)
('к', 'о', 'т')
(0, 1, 2)

Конструктор принимает любую последовательность: список станет кортежем — удобно сделать снимок данных, строка распадётся на символы, range развернётся в числа. Обратная дорога — list(t) — даёт изменяемый список.

ОперацияПримерЧто делает
доступ по индексуpoint[0], point[-1]элемент по позиции
срезdate[1:]новый кортеж с частью элементов
in и len2 in pointпроверка наличия и размер
count и indexdate.count(14)поиск по значениям
+ и *t + (3,)новый кортеж: склейка или повтор
tuple()tuple([1, 2])кортеж из любой последовательности

Что дальше

Кортеж умеет всё то же, что список, кроме изменения — и в этом его сила. В уроке 12 сводим соперников в таблицу: скорость, память, ключ словаря и правило выбора между tuple и list за три секунды.

Кортеж как ключ словаря: где это спасает

Практическая суперспособность кортежей — быть ключами словаря. Список не может: он изменяемый, и Python запретит его класть в словарь. Кортеж — можно, и это открывает словари с координатами, парами городов, комбинациями параметров — где ключ это две-три связанные величины, а не одна строка.

Типовой сценарий: таблица расстояний между городами. Ключ — кортеж (город_от, город_до), значение — километры. Один словарь вместо вложенных словарей и без риска рассинхронизации строк и столбцов: distances[('Москва', 'Сочи')] = 1600.

КлючПример из жизни
(город_от, город_до)таблица расстояний и тарифов
(строка, столбец)клетки поля: ходы фигур, мины в сапёре
(год, месяц)агрегаты по периодам
(имя, размер)склад: сколько чего лежит

Отсюда правило дизайна данных: если ключ должен быть «пачкой связанных значений» — кортеж. Список годится для коллекции одинаковых элементов, которую вы будете менять; кортеж — для связанной группы разных величин, которую менять нельзя.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

t = (10, 20, 30)

print(t[1] + t[-1])
print(len(t))
single = (7)

print(single + 3)
point = (2, 3)
shifted = point + (1,)

print(shifted)
print(point)
Проверь себя
0 / 8

1. Что вернёт type((5))?

2. point = (2, 3). Что произойдёт при point[0] = 10?

3. Что вернёт (2, 3) + (4,)?

4. Чему равен len(tuple('кот'))?

5. date = (14, 8, 2026). Что вернёт date[-1]?

6. Чем кортеж отличается от списка?

7. Что вернёт t * 2 при t = (1, 2)?

8. Как обратиться к последнему элементу кортежа t?

Карточки терминов
Запомнено: 0 / 8
Практика

Дан кортеж point = (3, 4). Выведите первый элемент, последний и их сумму — три печати.

practice.py
Вопросы и ответы по уроку

Что такое кортеж в Python простыми словами?

Фиксированный набор значений, который нельзя менять после создания: point = (2, 3). Читается по индексам как список, но без append и присваивания — состав защищён от случайных правок.

Урок 12: кортеж против списка

Как создать кортеж из одного элемента?

Поставить запятую: (5,). Без неё (5) — просто число в скобках: кортеж делает запятая, а не скобки.

Можно ли изменить кортеж?

Нет: присваивание по индексу и методы вроде append падают с TypeError. Варианты — собрать новый кортеж: t + (x,) или превратить в список: list(t).

Чем кортеж отличается от списка?

Чтение одинаковое — индексы, срезы, len, in. Разница в изменяемости: список можно дополнять и переписывать, кортеж — нет. Отсюда ещё два следствия: кортеж занимает меньше памяти и может быть ключом словаря.

Зачем кортежи, если есть списки?

Защита и смысл: координаты, даты и цвета не должны меняться — кортеж гарантирует это на уровне языка. Плюс кортеж работает ключом словаря и элементом множества — списку это недоступно.

Понравился урок? Сошлитесь на него

«Запятая делает кортеж, а не скобки: (5) — это число пять, и только (5,) — кортеж из одного элемента.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.