Кортежи в Python

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

Что такое кортеж?

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

Основные свойства кортежей:

  • Упорядоченность: элементы хранятся в определенном порядке
  • Неизменяемость: после создания нельзя добавить, удалить или изменить элементы
  • Индексируемость: к элементам можно обращаться по индексам
  • Допускают дубликаты: могут содержать повторяющиеся значения
  • Могут содержать разные типы данных: целые числа, строки, списки и т.д.

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

Существует несколько способов создания кортежей в Python:

С помощью круглых скобок ()

Python 3.13
# Пустой кортеж
>>> empty_tuple = ()

# Кортеж с одним элементом (обязательно с запятой!)
>>> single_item = (42,)
>>> print(type(single_item))
<class 'tuple'>
# Без запятой будет просто число: (42) == 42 >>> single_item_num = (42) >>> print(type(single_item_num))
<class 'int'>
# Кортеж чисел >>> numbers = (1, 2, 3, 4, 5) # Кортеж с разными типами данных >>> mixed = (1, "hello", True, 3.14) # Вложенные кортежи >>> nested = ((1, 2), ("a", "b"), (True, False))

Без скобок (разделение запятыми)

Python позволяет создавать кортежи даже без скобок, просто перечисляя элементы через запятую:

Python 3.13
# Создание кортежа без скобок
>>> coordinates = 10.5, 20.7, 30.9
>>> print(type(coordinates))
<class 'tuple'>

С помощью конструктора tuple()

Python 3.13
# Создание пустого кортежа
>>> empty_tuple = tuple()

# Преобразование списка в кортеж
>>> list_to_tuple = tuple([1, 2, 3])
>>> print(list_to_tuple)
(1, 2, 3)
# Преобразование строки в кортеж (каждый символ становится элементом) >>> string_to_tuple = tuple("Python") >>> print(string_to_tuple)
('P', 'y', 't', 'h', 'o', 'n')
# Преобразование множества в кортеж >>> set_to_tuple = tuple({1, 2, 3}) >>> print(set_to_tuple)
(1, 2, 3)

Доступ к элементам кортежа

Доступ к элементам кортежа осуществляется так же, как и в списках — через индексы и срезы:

Индексация

Python 3.13
>>> fruits = ("apple", "banana", "cherry", "date", "elderberry")

# Получение элементов по индексу
>>> first_fruit = fruits[0]
>>> print(first_fruit)
apple
# Отрицательные индексы для доступа с конца кортежа >>> last_fruit = fruits[-1] >>> print(last_fruit)
elderberry

Срезы (slices)

Python 3.13
>>> fruits = ("apple", "banana", "cherry", "date", "elderberry")

# Первые три элемента
>>> first_three = fruits[:3]
>>> print(first_three)
('apple', 'banana', 'cherry')
# От второго до четвертого >>> middle = fruits[1:4] >>> print(middle)
('banana', 'cherry', 'date')
# Разворот кортежа >>> reversed_tuple = fruits[::-1] >>> print(reversed_tuple)
('elderberry', 'date', 'cherry', 'banana', 'apple')

Методы кортежей

Поскольку кортежи неизменяемые, у них только два метода:

Python 3.13
>>> fruits = ("apple", "banana", "cherry", "banana", "date")

# Подсчет количества вхождений элемента
>>> banana_count = fruits.count("banana")
>>> print(banana_count)
2
# Поиск индекса первого вхождения элемента >>> banana_index = fruits.index("banana") >>> print(banana_index)
1

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

Python 3.13
# Узнать длину
>>> fruits = ("apple", "banana", "cherry")
>>> print(len(fruits))
3
# Проверить наличие элемента >>> print("apple" in fruits)
True
>>> print("mango" in fruits)
False
# Конкатенация (объединение) кортежей >>> more_fruits = ("pear", "orange") >>> all_fruits = fruits + more_fruits >>> print(all_fruits)
('apple', 'banana', 'cherry', 'pear', 'orange')
# Повторение >>> repeated = fruits * 2 >>> print(repeated)
('apple', 'banana', 'cherry', 'apple', 'banana', 'cherry')
# Распаковка >>> a, b, c = fruits >>> print(a, b, c)
apple banana cherry

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

Кортежи сравниваются поэлементно, слева направо, до первого отличия:

Python 3.13
>>> print((1, 2) < (1, 3))
True
>>> print((2, 0) < (1, 9))
False

В первом случае первые элементы равны (1 == 1), Python переходит ко вторым: 2 < 3, значит весь кортеж меньше. Во втором сразу 2 > 1, дальше можно не смотреть.

Это позволяет одной командой отсортировать список кортежей по нескольким полям сразу:

Python 3.13
>>> people = [("Bob", 30), ("Anna", 25), ("Anna", 30)]
>>> print(sorted(people))
[('Anna', 25), ('Anna', 30), ('Bob', 30)]

Сортировка идёт сначала по первому элементу (имени), а при равенстве — по второму (возрасту).

Неизменяемость кортежей

Важно понимать, что неизменяемость кортежей означает, что после создания кортежа вы не можете:

  • Изменить существующие элементы
  • Добавить новые элементы
  • Удалить элементы
Python 3.13
# Создаем кортеж
>>> coordinates = (10.5, 20.7, 30.9)

# Эти операции вызовут ошибку TypeError:
# coordinates[0] = 15.0     # Нельзя изменить элемент
# coordinates.append(40.2)  # Нет метода append
# coordinates.remove(20.7)  # Нет метода remove
# del coordinates[1]        # Нельзя удалить элемент

# Но можно создать новый кортеж на основе существующего
>>> new_coordinates = (15.0,) + coordinates[1:]
>>> print(new_coordinates)
(15.0, 20.7, 30.9)

Важное замечание о вложенных изменяемых объектах

Python 3.13
# Кортеж, содержащий список
>>> tuple_with_list = (1, 2, [3, 4])

# Это работает, потому что мы изменяем список внутри кортежа
>>> tuple_with_list[2][0] = 30
>>> print(tuple_with_list)
(1, 2, [30, 4])
# Но это вызовет ошибку - нельзя изменить сам кортеж # tuple_with_list[2] = [5, 6] # TypeError

Практические примеры использования кортежей

1. Возврат нескольких значений из функций

Python 3.13
>>> def get_user_info():
...     name = "Anna"
...     age = 30
...     is_admin = True
...     return name, age, is_admin

# Распаковка результата
>>> user_name, user_age, user_is_admin = get_user_info()
>>> print(f"Name: {user_name}, Age: {user_age}, Admin: {user_is_admin}")
Name: Anna, Age: 30, Admin: True

2. Фиксированные данные

Python 3.13
# Дни недели - идеальный пример неизменяемой последовательности
>>> DAYS_OF_WEEK = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")

# Использование
>>> today_index = 4  # Friday
>>> print(f"Today is {DAYS_OF_WEEK[today_index]}")
Today is Friday

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

Технически кортежи и списки часто пересекаются по возможностям, но в Python-коде у них разные роли:

  • Кортеж это «запись»: позиции имеют конкретный смысл. (name, age, email) это не «список из трёх произвольных вещей», а структура, в которой первая позиция всегда имя, вторая всегда возраст, третья всегда email.
  • Список это однородная коллекция: все элементы примерно одного «типа задачи», их количество может расти и сокращаться по ходу программы.

Эта разница важнее технических деталей: даже когда оба варианта работают, выбор влияет на читаемость и намерение кода.

ХарактеристикаСписок (list)Кортеж (tuple)
Синтаксис[1, 2, 3](1, 2, 3)
ИзменяемостьДаНет
МетодыМного: append, remove, sort...Только count, index
ПроизводительностьМедленнееБыстрее
Использование памятиБольшеМеньше
Может быть ключом словаряНетДа
Подходит дляКоллекций, которые могут менятьсяНеизменяемых данных

Распространенные ошибки при работе с кортежами

  1. Забытая запятая в кортеже с одним элементом

    Python 3.13
    # Неправильно (это не кортеж, а просто число в скобках)
    >>> not_a_tuple = (42)
    >>> print(type(not_a_tuple))
    
    <class 'int'>
    # Правильно >>> single_item_tuple = (42,) >>> print(type(single_item_tuple))
    <class 'tuple'>
  2. Попытка изменить кортеж

    Python 3.13
    >>> coordinates = (10.5, 20.7, 30.9)
    
    # Это вызовет ошибку
    >>> try:
    ...     coordinates[0] = 15.0
    ... except TypeError as e:
    ...     print(f"Error: {e}")
    
    Error: 'tuple' object does not support item assignment

Проверка понимания

Какое из следующих утверждений о кортежах в Python верно?


В следующем уроке посмотрим множества (set) — коллекции, в которых каждый элемент уникален.