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Полезное
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 importlib
def test(capsys):
expected = """From: Moscow
To: Saint Petersburg
Distance: 634 km"""
expect_output(capsys, expected)
def expect_output(capsys, expected):
importlib.import_module('solution')
out, _err = capsys.readouterr()
actual = out.strip('\n')
with capsys.disabled():
print('\n')
print(out)
assert actual == expectedРешение учителя откроется через:
20:00
