Кортежи (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)
🎯 Где применяются кортежи?
- Константные данные (например, дни недели, месяцы)
- Защита от изменений (когда важно сохранить исходные данные)
- Ключи в словарях (списки так не могут!)
- Возврат нескольких значений из функции
Пример с функцией:
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