Кортежи (Tuples) в Python
Кортежи (Tuples) в Python
Определение и синтаксис
Кортеж (tuple) — это неизменяемая (immutable) упорядоченная коллекция элементов. Элементы могут быть любого типа: числа, строки, списки, другие кортежи и т.д. Кортежи создаются с помощью круглых скобок () или просто через запятую.
# Создание кортежа
tuple1 = (1, 2, 3) # Стандартный способ
tuple2 = 4, 5, 6 # Без скобок (работает, но не рекомендуется)
single_element = (7,) # Кортеж с одним элементом (запятая обязательна!)
empty_tuple = () # Пустой кортеж
Основные свойства
- Неизменяемость: После создания элементы нельзя изменить, добавить или удалить.
- Упорядоченность: Элементы хранятся в порядке добавления.
- Индексируемость: Доступ к элементам осуществляется по индексам (как в списках).
- Хешируемость: Кортежи можно использовать как ключи словаря, если все их элементы хешируемы.
Кортежи vs Списки
Сходства:
- Оба типа поддерживают индексацию и срезы.
- Позволяют хранить элементы разных типов.
Различия:
| Критерий | Список (list) | Кортеж (tuple) |
|---|---|---|
| Изменяемость | Изменяемый (mutable) | Неизменяемый (immutable) |
| Скорость доступа | Медленнее (для больших данных) | Быстрее (оптимизация памяти) |
| Использование | Для однородных данных | Для гетерогенных данных |
| Пример | [1, 2, 3] | (1, 2, 3) |
Когда использовать кортежи?
- Когда нужно гарантировать неизменность данных (например, ключи в словарях).
- Для возврата нескольких значений из функции.
- Для экономии памяти (кортежи занимают меньше места, чем списки).
# Пример возврата нескольких значений из функции
def get_user_info():
return "Alice", 30, "alice@example.com"
name, age, email = get_user_info()
Namedtuple
Класс namedtuple из модуля collections позволяет создавать кортежи с именованными полями, что делает код более читаемым.
Создание namedtuple:
from collections import namedtuple
# Определение структуры
Person = namedtuple("Person", ["name", "age", "city"])
# Создание экземпляра
alice = Person(name="Alice", age=30, city="London")
# Доступ к полям
print(alice.name) # Alice
print(alice[1]) # 30 (работает и обычная индексация)
Преимущества:
- Читаемость: Поля доступны по именам (вместо индексов).
- Неизменяемость: Как и обычные кортежи.
- Методы:
_asdict(): Конвертирует в словарь._replace(): Создает новый кортеж с измененными значениями.
# Пример методов
print(alice._asdict()) # {'name': 'Alice', 'age': 30, 'city': 'London'}
bob = alice._replace(name="Bob", age=25)
Работа с кортежами
Основные операции:
- Конкатенация:
new_tuple = (1, 2) + (3, 4) # (1, 2, 3, 4) - Повторение:
repeated = ("Hi",) * 3 # ("Hi", "Hi", "Hi") - Проверка вхождения:
print(2 in (1, 2, 3)) # True
Неизменяемость: ограничения
Попытка изменить кортеж вызывает ошибку:
my_tuple = (1, 2, 3)
# my_tuple[0] = 10 # Ошибка: 'tuple' object does not support item assignment
Заключение
Кортежи — это эффективный инструмент для работы с неизменяемыми данными. Их стоит использовать:
- Когда нужно защитить данные от случайных изменений.
- Для оптимизации памяти и скорости.
- В качестве ключей словаря.
namedtuple добавляет ясности коду, заменяя “безликие” индексы на понятные имена полей. В отличие от списков, кортежи подчеркивают статичность данных, что делает их выбором для констант, настроек или сложных структур данных.