Python: Составные данные
Теория: Пары
Мы уже написали несколько полезных функций для работы с точками и поняли, как работает эта абстракция. Теперь пришло время копнуть на уровень глубже и посмотреть, как же устроены наши точки.
Устроены они достаточно просто и используют структуру данных, которая называется парой. Пар в самом языке Python не существует, мы их реализовали с помощью отдельной библиотеки, и выше можно увидеть пример того, как они используются. Мы подключаем из библиотеки конструктор cons() и селекторы car() и cdr(). Конструктор создает пару, а селекторы служат для извлечения из пары первого значения (с помощью car()) и второго значения (с помощью cdr()). Все достаточно просто и очень похоже на реализацию точек из прошлого урока.
Что интересно, элементами пары могут быть другие пары. В будущем это даст нам очень мощные возможности для того, чтобы строить более сложные структуры данных, в том числе списковые.
Давайте посмотрим, как представлены наши точки с помощью пар:
Здесь все предельно просто: make_point() — это функция, которая принимает x и y и вызывает конструктор пары с этими аргументами. То же самое с селекторами: get_x() и get_y() принимают на вход точку и вызывают с этой точкой car() и cdr() соответственно.
Можно заметить, что сработало бы даже такое определение:
Здесь все верно с синтаксической точки зрения и с точки зрения получения конечного результата. Но с таким способом определения есть некоторые проблемы: по сути, когда мы делаем такое присваивание, получается, что make_point() и cons() являются одним и тем же экземпляром. Кто-то может сказать, что они ссылаются на одну и ту же функцию, но это уже тонкости реализации конкретного языка программирования. На практике это означает, что, запустив построенный таким образом код, вы не увидите вызова функций make_point(), get_x() или get_y(), потому что их фактически не существует. При отладке вы не найдете этих функций в бэктрейсе. Вы можете захотеть увидеть все вызовы, например, make_point(), но вы точно не захотите отслеживать в вашей программе все вызовы cons(), которые могут использоваться не только для точек, а вообще для любых библиотек. Поэтому мы не используем такое определение, но о нем нужно знать, чтобы понимать, как в целом все работает.
Теперь, используя пары, мы можем строить новые абстракции, расширяя нашу библиотеку графических примитивов. Мы вводим понятие отрезка, для которого мы создаем конструктор и селекторы:
Нам нужно сделать две точки (потому что любой отрезок представлен двумя точками). После этого мы используем конструктор make_segment() и передаем туда наши точки, а с помощью селекторов start_segment() и end_segment() мы получаем точки. Важно, что мы получаем именно точки, потому что это тоже составные данные со своими селекторами, с помощью которых можно получать примитивные значения и производить над ними какие-либо манипуляции при необходимости.
Пары
Обратите внимание на то, что пары неизменяемы. Нельзя просто так взять и изменить пару. Можно только создать новую на основе предыдущей. Поначалу такой способ программирования может показаться необычным и сложным, так как надо перестроить свое мышление. Чем дальше вы будете продвигаться по курсам, тем больше он вам начнет нравиться. Вы увидите, как часто упрощается код и его отладка в отсутствие изменяемости.
Рекомендуемые программы
Завершено
0 / 7

