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.8Python сопоставляет значения с переменными по порядку. Количество переменных должно совпадать с количеством элементов.
Применимость в реальной жизни
Кортежи в 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Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import runpy
def test(capsys):
expected = """From: Moscow
To: Saint Petersburg
Distance: 634 km"""
runpy.run_module('solution')
out, _ = capsys.readouterr()
assert out.strip() == expectedРешение учителя откроется через:
20:00
