Кортежи (Tuple): неизменяемые коллекции данных

🔥 Зачем нужны кортежи?

Кортежи (tuple) — это "неизменяемые списки". Они похожи на списки, но их нельзя изменить после создания. Зачем же они нужны, если есть списки?

  • Быстрее списков (оптимизация памяти и скорости)
  • Безопаснее (защита от случайных изменений)
  • Используются как ключи в словарях (в отличие от списков)
  • Идеальны для хранения константных данных
# Сравним создание списка и кортежа
my_list = [1, 2, 3]  # Список (изменяемый)
my_tuple = (1, 2, 3)  # Кортеж (неизменяемый)

🛠 Создание кортежей — 4 способа

1. Через круглые скобки (самый распространённый способ):

colors = ('red', 'green', 'blue')

2. Через функцию tuple():

numbers = tuple([1, 2, 3])  # Конвертация из списка

3. Кортеж из одного элемента (не забудьте запятую!):

single = (42,)  # Вот так правильно
not_a_tuple = (42)  # А это просто число в скобках!

4. Без скобок (автоматическая упаковка):

point = 10, 20  # Python сам создаст кортеж (10, 20)

🚫 Неизменяемость — главная фишка

Попробуем изменить кортеж и посмотрим, что произойдёт:

fruits = ('apple', 'banana', 'cherry')
fruits[1] = 'kiwi'  # Вызовет TypeError!

Но можно "обойти" неизменяемость, если внутри есть изменяемые объекты:

mixed = (1, 2, [3, 4])  # Кортеж с вложенным списком
mixed[2][0] = 999  # Так можно! Меняем список внутри кортежа
print(mixed)  # (1, 2, [999, 4])

🔍 Операции с кортежами

Кортежи поддерживают почти все те же операции, что и списки (кроме изменяющих):

# Доступ по индексу
week = ('Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс')
print(week[0])  # 'Пн'

# Срезы
print(week[1:4])  # ('Вт', 'Ср', 'Чт')

# Длина кортежа
print(len(week))  # 7

# Проверка наличия
print('Сб' in week)  # True

# Конкатенация
new_tuple = (1, 2) + (3, 4)  # (1, 2, 3, 4)

🎯 Где применяются кортежи?

  1. Константные данные (например, дни недели, месяцы)
  2. Защита от изменений (когда важно сохранить исходные данные)
  3. Ключи в словарях (списки так не могут!)
  4. Возврат нескольких значений из функции

Пример с функцией:

def get_user():
    name = "Данила"
    age = 30
    return name, age  # Фактически возвращает кортеж!

user_data = get_user()  # ('Данила', 30)

💡 Продвинутые техники

Распаковка кортежей

coordinates = (10, 20, 30)
x, y, z = coordinates  # x=10, y=20, z=30

Именованные кортежи (коллекции.namedtuple)

from collections import namedtuple
Person = namedtuple('Person', ['name', 'age'])
daniil = Person(name='Данила', age=30)
print(daniil.name)  # 'Данила'

Сравнение кортежей

(1, 2) < (1, 3)  # True (сравнение по элементам)

⚡️ Практический пример: кэширование результатов

Кортежи — идеальные ключи для кэша, т.к. они хэшируемые:

cache = {}

def cached(a, b):
    key = (a, b)  # Создаём кортеж-ключ
    if key not in cache:
        cache[key] = a * b  # Сложные вычисления
    return cache[key]

print(cached(2, 3))  # 6 (вычислено)
print(cached(2, 3))  # 6 (взято из кэша)

🔄 Когда выбрать список, а когда кортеж?

Кортеж (tuple) Список (list)
Неизменяемый Изменяемый
Быстрее Медленнее
Меньше памяти Больше памяти
Ключи словаря Не может быть ключом
Гарантия неизменности Гибкость изменений

Выбирайте кортежи, когда данные не должны меняться — это сделает код надежнее и быстрее! А если нужны частые изменения — используйте списки.

Как говорит Данила Бежин в своих уроках: "Кортежи — это как швейцарские часы: надёжные, точные и неизменные". Посмотрите его видео про коллекции для более глубокого погружения: https://www.youtube.com/@DanilaBezhin

Скрыть рекламу навсегда

🌱 Индвидидулаьные занятия

Индивидуальные онлайн-занятия по программированию для детей и подростков

Личный подход, без воды, с фокусом на понимание и реальные проекты.

🚀 Записаться на занятие