Python: Кортежи

Помимо примитивных, в Python есть составные типы данных, хранящие сразу несколько значений. Студент в университете описывается именем, возрастом и средним баллом. Фильм описывается названием, годом выпуска и рейтингом. Такие группы значений удобно хранить вместе, а не в виде набора отдельных переменных.

В Python встроено несколько способов работы с составными данными, самый простой из которых кортеж (tuple).

Представьте, что мы хотим работать в коде с понятием студента, у которого есть имя, возраст и средний балл. Можно попробовать описывать студента тремя переменными:

student_name = 'Alice'
student_age = 20
student_score = 4.8

А что будет если у нас будет несколько студентов? Получится очень неуклюжий, код, который никто не оценит. А вот с кортежами жизнь все становится интереснее. Студента можно представить в виде кортежа.

Кортеж записывается в круглых скобках через запятую:

student = ('Alice', 20, 4.8)       # имя, возраст, средний балл

point = (10, 20)
film = ('Inception', 2010)    # название, год
user = ('Andrey Petrov', 'email@example.com', 'hexletcommunity', 100)    # фио, email, telegram, age

Скобки можно опустить. Python определяет кортеж по запятым.

student = 'Alice', 20, 4.8       # имя, возраст, средний балл

point = 10, 20

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

Элементы кортежа нумеруются с нуля. К ним обращаются по индексу как в строках.

student = ('Alice', 20, 4.8)
print(student[0])  # => Alice
print(student[1])  # => 20
print(student[2])  # => 4.8

Кортежи неизменяемы

После создания кортеж нельзя изменить. Попытка заменить элемент вызывает ошибку.

student = ('Alice', 20, 4.8)
student[0] = 'Bob'  # TypeError: 'tuple' object does not support item assignment

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

Если данные нужно обновить, создают новый кортеж и переприсваивают переменную.

student = ('Alice', 20, 4.8)
# используя данные предыдущего кортежа
student = (student[0], student[1] + 1, 4.9)  # прошел год, балл вырос

print(student)  # => ('Alice', 21, 4.9)

Старый кортеж остается нетронутым (но к нему уже нельзя получить доступ). Переменная просто начинает указывать на новый.

Распаковка

Элементы кортежа можно присвоить нескольким переменным сразу.

student = ('Alice', 20, 4.8)
name, age, gpa = student

print(name)  # => Alice
print(age)   # => 20
print(gpa)   # => 4.8

Python сопоставляет значения с переменными по порядку. Количество переменных должно совпадать с количеством элементов.

Применимость в реальной жизни

Кортежи в Python встречаются достаточно часто и используются для хранения нескольких связанных значений вместе. Обычно их применяют в ситуациях, когда набор данных имеет фиксированную структуру и не должен изменяться после создания. Например, с помощью кортежа можно хранить координаты точки (10, 20) или цвет (255, 0, 0). Кортежи считаются одной из базовых структур данных языка и регулярно используются как в самом Python, так и во многих библиотеках и фреймворках.

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

Задание

Два города лежат на одной трассе. Каждый описан кортежем с названием и позицией в километрах от начала маршрута:

city_a = ('Moscow', 10)
city_b = ('Saint Petersburg', 644)

Вычислите расстояние между городами и выведите результат в таком формате:

From: Moscow
To: Saint Petersburg
Distance: 634 km

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются