Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Семантика списков и словарей 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. Simple Made Easy
  4. Simple Made Easy (перевод текста выступления)

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
22 сентября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

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

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

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