Что такое кортежи в Python и как их использовать
База «змееуста»: работаем с индексами, сравниваем и перебираем элементы.
Фото: Justin Sullivan / Getty Images
Кортежи (tuple) в Python хранят последовательности элементов, и этим они похожи на списки. Но между этими двумя структурами есть серьёзные различия. Сегодня мы разберёмся в них и научимся работать с кортежами.
Вы узнаете:
Что такое кортежи
Кортежи (тип tuple) — это неизменяемый тип данных в Python, который используется для хранения упорядоченной последовательности элементов.
У этих коллекций есть три замечательных свойства:
Неизменяемость. После того как кортеж создан, в него нельзя добавлять элементы, а также изменять их или удалять. При попытке это сделать интерпретатор выдаст ошибку TypeError.
Упорядоченность. Элементы кортежа располагаются в определённом порядке, который тоже неизменяем. К любому элементу можно обратиться по его индексу (порядковому номеру).
Элементами кортежа могут быть объекты разных типов данных: числа, строки, списки, другие кортежи и другие. Элементы-коллекции могут иметь неограниченную глубину вложенности. Например, кортеж может включать в себя список, который будет содержать другой список, который вновь будет содержать список и так далее.
Кортежи записываются с использованием круглых скобок ():
my_tuple — имя переменной, которой присваивается кортеж.
(значение1, значение2...) — это сам кортеж, который содержит элементы значение1, значение2 и так далее.
Они могут состоять из элементов разных типов и их сочетаний:
Когда использовать кортеж
Применение кортежей связано с их свойствами — неизменяемостью и строгим порядком элементов. Разберём ситуации, когда это полезно.
Требуется защитить элементы от изменений
Если нужно защитить данные от случайного или намеренного изменения, то можно использовать кортежи. Например, этот тип данных подойдёт для сохранения информации о датах рождения клиентов.
Обратите внимание: неизменяемость кортежей не абсолютна. У неё есть исключение — если внутри кортежа находятся изменяемые элементы, например списки, словари или множества, то их значения можно изменить.
Например:
Результат выполнения кода:
Как видите, никакой ошибки нет, хотя кортеж изменился.
Необходимо экономить память
Кортежи занимают в памяти меньше места, чем списки. Это легко проверить:
В результате выполнения кода получим:
Кортеж занимает в памяти на 16 байт меньше, чем список. Из-за малой величины сравниваемых объектов разница почти незаметна, но при работе с данными большего объёма экономия может быть значимой.
Предстоит работать со словарями
Кортежи идеально подходят для использования в качестве ключей в словарях, так как ключи в них должны быть объектами неизменяемого типа данных. Проверим это:
В результате получим:
С кортежем словарь работает. Если попытаться в качестве ключа использовать список, то возникнет ошибка, так как списки — изменяемый тип данных.
Как работать с кортежами в Python
Рассмотрим основные операции с кортежами.
Создание кортежа
Создать кортеж в Python можно по меньшей мере пятью способами. Рассмотрим каждый из них.
- С помощью круглых скобок:
- Без круглых скобок:
- Используя встроенную функцию tuple():
- С помощью оператора упаковки, который мы разберём дальше:
- Из итерируемого элемента, например строки, с помощью функции tuple():
Можно создать пустой кортеж:
Если требуется кортеж, состоящий всего из одного элемента, то после элемента необходимо обязательно поставить запятую:
Доступ к элементам по индексам
Кортеж — это упорядоченная последовательность. Поэтому для доступа к его элементам можно использовать индексы.
Индексация начинается с нуля и заканчивается значением, равным длине кортежа, уменьшенным на единицу:
Для доступа к элементам с конца кортежа можно использовать отрицательные индексы. В этом случае индексация начинается с -1 и заканчивается значением, равным длине кортежа со знаком минус.
Напишем код:
Чтобы обратиться ко вложенным элементам, используйте двойную индексацию:
Разберём код. Кортеж nested_tuple содержит вложенный кортеж (3, 4). Для доступа к элементам вложенного кортежа используем двойную индексацию: nested_tuple[2][0] обращается к первому элементу вложенного кортежа, а nested_tuple[2][1] обращается ко второму элементу.
Упаковка и распаковка
Упаковка (packing) и распаковка (unpacking) — это операции, которые позволяют создавать кортеж из набора значений и извлекать значения из кортежа в переменные. Рассмотрим их подробнее.
Упаковка кортежа. Значения 1, 2, 3 и 'hello' автоматически упаковываются в кортеж:
Распаковка кортежа. Элементы кортежа извлекаются в переменные:
Обмен значениями между переменными. С помощью упаковки и распаковки кортежей можно обменять значения переменных между собой без использования временной переменной.
Посмотрим пример кода:
Операция упаковки (y, x) сначала создаёт кортеж из двух значений (10, 5), затем операция распаковки (x, y) распаковывает кортеж и присваивает значения переменным x и y соответственно. Теперь переменная x содержит 10, а y содержит 5.
Сравнение
Кортежи в Python сравниваются покомпонентно начиная с первого элемента до первого неравенства или до конца переменной. Если кортежи имеют одинаковую длину и все соответствующие элементы равны, то они считаются равными:
Для сравнения используются стандартные операторы ==, !=, >, <, >=, <=.
При сравнении используются правила:
- когда сравниваются числовые элементы, большим считается тот кортеж, у которого первый отличающийся элемент больше;
- когда сравниваются строки, сравнение происходит по порядку в алфавите;
- элементы различных типов сравнивать нельзя — получим ошибку TypeError;
- если длины кортежей различны, то кортеж с меньшей длиной считается наименьшим.
Пример:
Проверка принадлежности элемента
Чтобы проверить, принадлежит ли элемент кортежу, используется оператор in. Если элемент присутствует в кортеже, оператор возвращает True, в противном случае — False.
Перебор элементов
Для перебора элементов кортежа в Python используется цикл for или while:
Код выводит каждый элемент кортежа my_tuple на новой строке.
Удаление кортежа
Удалять из кортежа элементы нельзя, но можно удалить его полностью с помощью ключевого слова del:
В этом примере del my_tuple удаляет ссылку на кортеж из памяти. После этого переменной my_tuple больше не существует и попытка обратиться к ней вызовет ошибку NameError.
Конкатенация и повторение
В Python для кортежей доступны операции конкатенации (сложения) и повторения (умножения). Эти операции могут использоваться при создании новых кортежей на основе существующих.
Конкатенация. Это объединение двух кортежей в один новый кортеж с помощью оператора +.
Напишем код:
Результат:
Повторение. Этот способ создания кортежа напоминает арифметическое умножение: справа от исходного кортежа нужно добавить оператор * и указать, сколько раз он повторится.
Результат выполнения кода:
При выполнении операций конкатенации и повторения создаются новые кортежи, а исходные остаются неизменными.
Функции кортежей Python
В Python есть встроенные функции, которые облегчают работу с кортежами.
Во многих статьях можно встретить формулировку «методы кортежей», но это не совсем корректно. Метод — это понятие из объектно-ориентированного программирования, обозначающее функцию или процедуру, принадлежащую к какому-либо классу или объекту. Ниже мы говорим про функции, которые принимают и возвращают значения, без привязки к классам или объектам.
Определение длины, суммы, минимального и максимального элемента
Длину кортежа можно получить функцией len(), которая возвращает количество элементов в кортеже:
Результат:
Сумма элементов рассчитывается легко запоминающейся функцией sum():
Результат:
Если кортеж пуст, len() и sum() возвращают 0.
Минимальный и максимальный элементы кортежа можно получить с помощью функций min() и max():
Результат выполнения:
Если кортеж пуст, то использование функций min() и max() вызовет ошибку ValueError.
Сортировка кортежа
Элементы можно отсортировать по возрастанию или по убыванию. Так как кортежи относятся к неизменяемому типу данных, то кортеж с упорядоченными элементами нужно будет сохранить в новой переменной.
Для сортировки используется функция sorted():
Результат:
Остановимся на коде:
- sorted(original_tuple) создаёт новый список, содержащий отсортированные элементы из original_tuple;
- tuple(...) создаёт новый кортеж из отсортированного списка.
Если нужна сортировка в обратном порядке, в функции sorted() используется параметр reverse=True:
Получаем:
Срезы в кортежах
Срезы используются для извлечения из кортежей подмножества элементов. Для этого необходимо указать начальный и конечный индекс, а также шаг среза.
Для определения начала и конца среза можно использовать положительные и отрицательные индексы:
- левый индекс указывает на элемент, с которого начинается срез;
- правый индекс указывает на элемент, которым заканчивается срез, этот элемент в срез не включается.
Получим срез, указав положительные индексы:
Результат:
Срез с отрицательными индексами:
Результат:
Если индексы пропущены, то срез будет включать все элементы от начала кортежа до заданного конца среза или от заданного начала среза до конца кортежа:
Результат:
Преобразование в другие типы данных
В Python можно преобразовывать кортежи в другие типы данных: списки, строки, множества или словари.
Так можно превратить кортеж в список:
Результат:
А так можно преобразовать кортеж в строку:
Здесь использовали встроенную функцию str.join. Работает она просто — переводит каждый элемент кортежа в строковый тип, а затем объединяет их в одну строку.
Результат:
Преобразовать кортеж во множество:
Результат:
Множества — это неупорядоченные коллекции, которые состоят из уникальных элементов. Если преобразовать кортеж во множество, то все дубликаты в нём удалятся.
Кортеж в словарь (пары «ключ — значение»):
Результат:
Как можно изменить элементы
Хотя кортежи относятся к неизменяемым элементам, есть трюк, который позволяет их изменять. Для этого нужно перевести кортеж в список, сделать необходимые преобразования, а затем превратить полученный список в кортеж:
Результат:
Другой подоход — создать новый кортеж с изменёнными значениями:
Результат:
В этом примере создаём новый кортеж updated_tuple, включая все элементы кортежа my_tuple с начала до второго, добавляем к ним новое значение 10, а затем добавляем все элементы my_tuple начиная с четвёртого и до конца.
Мы рассмотрели только базовые понятия и операции с кортежами. Если вы хотите погрузиться в работу с ними глубже, то советуем перейти к документации. И обязательно пишите код из примеров в своём редакторе кода или IDE — это поможет закрепить теорию.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!