Кортежи: неизменяемые последовательности
Что такое кортежи
Кортеж - упорядоченная коллекция объектов, которая хранит элементы в определённом порядке и не позволяет менять содержимое после создания.
Кортежи можно представить как список, поведение которого фиксировано: после создания элементы остаются теми же самыми значениями и на тех же местах. Это делает кортежи удобными для хранения данных, которые не должны меняться в ходе выполнения программы.
Простейший пример явного создания кортежа выглядит так: . Пустой кортеж обозначается как , а кортеж с одним элементом — как (обратите внимание на запятую в конце).
Создание кортежей — синтаксис и преобразования
Кортежи можно создавать с помощью литералов, перечисляя элементы в круглых скобках, либо при помощи функции преобразования из других последовательностей. Так, преобразование списка в кортеж можно записать как .
Упаковка - автоматическое создание кортежа при перечислении элементов без явного использования круглых скобок; Распаковка - операция присвоения элементов кортежа отдельным переменным.
Упаковка и распаковка часто используются вместе: например, переменные можно получить из кортежа через множественное присваивание . При распаковке важно, чтобы число переменных соответствовало числу элементов в кортеже, иначе возникнет ошибка.
Создание и распаковка: можно распаковать так: .
Индексация и срезы
Кортеж — упорядоченная последовательность, поэтому к конкретному элементу можно обратиться по индексу. Первый элемент имеет индекс , а последний — можно получить через отрицательную индексацию .
Срезы работают так же, как и для списков: можно взять подпоследовательность через указание начального и конечного индексов или с шагом . Срез возвращает новый кортеж (или другую последовательность), не меняя исходный кортеж.
Срез - операция получения подпоследовательности по диапазону индексов; результат — новый объект.
Доступ по индексу и срез: получить первый элемент — , получить элементы со второго по третий (не включая третий индекс) — .
Неизменяемость: что это означает и какие плюсы
Неизменяемость - свойство объекта, при котором его содержимое нельзя изменить после создания (нет операции присваивания для элементов).
Из-за неизменяемости попытка присвоить значение по индексу приведёт к ошибке: пример такой операции — — недопустим для кортежей. Это делает кортежи предсказуемыми: их можно безопасно передавать в функции и использовать как ключи в словарях, поскольку хеш значения остаются стабильными.
Кортежи, в отличие от списков, могут быть хешируемыми (если все их элементы тоже хешируемы) и поэтому ими можно пользоваться в качестве ключей словаря. Пример использования кортежа в роли ключа: .
Нельзя изменить элемент кортежа: попытка выполнить вызовет TypeError.
Операции над кортежами и встроенные функции
Несмотря на то, что содержимое кортежа нельзя изменить, над кортежами доступны операции объединения и повторения. Объединение двух кортежей записывается как , повторение — как .
Также для кортежей работают некоторые встроенные функции: узнать длину можно через ; подсчитать количество вхождений элемента — с помощью метода , а найти индекс первого вхождения — .
Если нужно получить из кортежа изменяемую последовательность, можно преобразовать его в список: для этого используется функция . После преобразования можно менять элементы и затем при необходимости снова сделать кортеж.
Операции: длина кортежа — , объединение двух кортежей: .
Вложенные кортежи и структуры данных
Кортежи могут содержать любые объекты, в том числе другие кортежи. Такая вложенность позволяет строить сложные, но неизменяемые структуры данных; пример вложенного кортежа: .
Стоит помнить: неизменяемость верхнего уровня не запрещает изменять изменяемые объекты внутри кортежа. Если кортеж содержит список, содержимое этого списка можно менять. Это важно учитывать при проектировании данных.
Вложенные кортежи удобно использовать для хранения координат, пар значений и других структур, где порядок важен и элементы не должны изменяться по ходу выполнения программы.
Пример вложенного кортежа: — доступ к вложенному элементу осуществляется через комбинированную индексацию.
Практические применения и советы
Кортежи хороши для хранения фиксированных наборов значений: координат точек, возвращаемых несколькими значениями функций, константных конфигураций. Если вы хотите, чтобы структура была неизменной и использовалась как ключ в отображениях — выбирайте кортеж.
При проектировании API полезно возвращать несколько значений в виде кортежа: например, функция может вернуть три численных значения как и затем их распаковать в переменные {FORMULA_20}.
Если нужно поменять часть кортежа, обычно делается создание нового кортежа на основе существующего: берут срезы и объединяют их. Например, заменить середину можно, создавая новый кортеж из фрагментов с помощью объединения и/или повторения.
Использование в коде: преобразовать список в кортеж — , затем вывести длину — .