Зарегистрируйтесь, чтобы продолжить обучение

Семантика списков и словарей Python: Абстракция с помощью данных

Кортеж — это самый простой способ представить точку. В этом уроке мы разберемся, правильный ли это способ, и почему в этом случае не стоит использовать список.

Список

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

Список — это коллекция, набор значений, которые можно перебирать и одинаково перерабатывать. При этом значения могут быть не связаны друг с другом и существовать независимо. Часто в списке нет позиционности — зафиксированных мест для значений. Либо позиция зависит от конкретной задачи. Вот некоторые примеры из жизни, где используются списки:

  • Список стоп-слов
  • Список пользователей
  • Список уроков курса
  • Список ходов шахматной партии — порядок важен

Например, в нашей графической библиотеке список подходит для хранения коллекции точек или набора отрезков.

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

Получается, список используется как структура для описания составного объекта. При этом объект описывается не одним значением, а несколькими, в данном случае — двумя числами-координатами.

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

Словари

Посмотрим на пример словаря:

point = {"x": 2, "y": 3}
symmetrical_point = {
    "x": -point["x"],
    "y": point["y"],
}

Кода стало чуть больше, но семантика важнее. У каждого элемента данных теперь есть имя. Их использовать проще, чем индексы.

Если вам нужно поработать с содержимым вместо кортежа целиком, рекомендуем распаковывать кортежи в переменные с говорящими именами. Например, код с переменной x или обращением по ключу point["x"] проще понимать, чем код с point[0]. Словари выглядят информативнее при выводе на экран — по именам ключей часто можно сразу догадаться, о чем идет речь.

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

point1 = [2, 3]
point2 = [-8, 10]
segment = [point1, point2]

# код сложный для понимания
point1[1]
point2[0]
segment[1][0]

Понять, что это отрезок, нереально без понимания контекста. Единственное, что частично спасает ситуацию — хорошие имена переменных. Но этого мало.

Важно использовать правильную и подходящую под задачу структуру данных:

point1 = {"x": 3, "y": 4}
point2 = {"x": -8, "y": 10}
segment = {
    "begin_point": point1,
    "end_point": point2,
}

# good semantics
point1["x"]
point2["y"]
segment["begin_point"]["x"]

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

Если использовать словари, то у вас будет преимущество — расширяемость. Кортеж, который используется как структура, хрупок. Поменять местами значение аргументов нельзя. Так сломается весь код, который рассчитывал на определенный порядок. Либо придется все переписывать.

Расширить кортеж тоже просто так не получится. Часть кода продолжит работать, но часть может сломаться, например, x, y = point. А использование словаря не полагается на порядок ключей. Он не зависит от их количества. В любой момент можно добавить новый ключ, и программа с большей вероятностью останется работоспособной.

Также словарем можно представить и другие сущности:

  • Пользователь
  • Курс
  • Урок
  • Платеж
  • Шахматная партия — помимо даты, имен и места она содержит набор ходов

Выводы

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

  • Список — это коллекция, набор однотипных значений, которые можно перебирать и одинаково перерабатывать. При этом значения могут быть не связаны друг с другом и существовать независимо
  • Часто в списке нет позиционности — зафиксированных мест для значений. Либо позиция зависит от конкретной задачи
  • С помощью кортежа как структуры с фиксированным составом элементов можно эффективно представить точки. Элементы кортежа не меняют свои позиции, их не становится ни больше, ни меньше
  • Представить сущности можно и с помощью словарей
  • Если использовать словари, то у вас будет преимущество — расширяемость. Словари не зависят от количества ключей. В любой момент можно добавить новый, и программа с большей вероятностью останется работоспособной

Дополнительные материалы

  1. Ментальное программирование 1
  2. Ментальное программирование 2
  3. Ментальное программирование 3
  4. Simple Made Easy
  5. Simple Made Easy (перевод текста выступления)

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»