Кортежи (Tuples) в Python

Кортежи (Tuples) в Python


Кортежи (Tuples) в Python

Определение и синтаксис

Кортеж (tuple) — это неизменяемая (immutable) упорядоченная коллекция элементов. Элементы могут быть любого типа: числа, строки, списки, другие кортежи и т.д. Кортежи создаются с помощью круглых скобок () или просто через запятую.

# Создание кортежа
tuple1 = (1, 2, 3)        # Стандартный способ
tuple2 = 4, 5, 6          # Без скобок (работает, но не рекомендуется)
single_element = (7,)     # Кортеж с одним элементом (запятая обязательна!)
empty_tuple = ()          # Пустой кортеж

Основные свойства

  1. Неизменяемость: После создания элементы нельзя изменить, добавить или удалить.
  2. Упорядоченность: Элементы хранятся в порядке добавления.
  3. Индексируемость: Доступ к элементам осуществляется по индексам (как в списках).
  4. Хешируемость: Кортежи можно использовать как ключи словаря, если все их элементы хешируемы.

Кортежи 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 добавляет ясности коду, заменяя “безликие” индексы на понятные имена полей. В отличие от списков, кортежи подчеркивают статичность данных, что делает их выбором для констант, настроек или сложных структур данных.