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

Полезное

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

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