Чем полезны операторы?

Shape Image One
Чем полезны операторы?

Почему же некоторые разработчики так любят операторы?

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

add (x, y) == add (y, x) (1)

  Уравнение (1) выражает закон, что сложение коммутативно. Это обычно пишется с использованием оператора, что делает его более кратким: 

x + y == y + x (1a)

  Это похоже на незначительное усиление. Теперь рассмотрим ассоциативный закон:

 add (x, add (y, z)) == add (add (x, y), z) (2)

 Уравнение (2) можно переписать с помощью операторов: 

x + (y + z) == (x + y ) + z (2a) 

Это гораздо менее запутанно, чем (2), и приводит к наблюдению, что круглые скобки являются избыточными, поэтому теперь мы можем написать

x + y + z (3)

Многие другие законы также пишутся проще с помощью операторов. Вот еще один пример об элементе идентификации сложения: 

add (x, 0) == add (0, x) == x (4)

сравните с такой формой записи:

x + 0 == 0 + x == x (4a)

Общая идея здесь заключается в том, что, как только вы выучите эту простую запись, уравнениям, написанным с их помощью, будет легче «манипулировать», чем уравнениям, написанным с использованием функциональной записи.

Пожалуй, все согласятся с утверждением, что формулы, записанные с операторами лучше воспринимаются. Такой процесс подсознательный, но благодаря ему мы понимаем, что на самом деле видим. Например, «стул», а не «куски дерева, соединенные определенным образом». Запись в виде функций привлекает другие отделы нашего мозга, менее подсознательные (это связано с чтением и пониманием прочитанного).

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

mul (n, add (x, y)) == add (mul (n, x), mul (n, y)) (5).

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

Сравним с такой формой записи:

 n (x + y) == nx + ny (5b)

но, увы, в настоящее время это выходит за рамки возможностей парсера Python.

Еще один очень мощный аспект операторских обозначений заключается в том, что их удобно применять к объектам разных типов. Например, законы (1) — (5) также работают, когда xy и z являются векторами одинакового размера, а n является скаляром (заменяя вектор нулей на литерал «0»), а также если они являются матрицами ( опять же, n должен быть скаляром). 

И вы можете сделать это с объектами в разных доменах. Например, вышеуказанные законы (1) — (5) применимы и к функциям (n снова является скаляром). 

Выбирая операторы, математики используют свое визуальное восприятие как помощника: таким образом они открывают новые законы быстрее.

Сейчас программирование отличается от математики. Но все мы знаем, что читабельность имеет значение, и именно здесь наступает время перегрузки операторов в Python. Сразу как вы усвоили простые свойства операторов, вы понимаете, что + для конкатенации строк или списка выглядит более читабельным, и выше мы уже частично объяснили почему так.

Конечно, можно переусердствовать — тогда вы получите Perl. Но часто мы забываем, что гораздо легче понять следующую запись:

d = d1 + d2

     по сравнению с этим: 

d = d1.copy ( )      d.update (d2) 

и дело не только в меньшем количестве строк кода: первая форма позволяет нам использовать нашу визуальную обработку, чтобы помочь нам быстрее увидеть смысл — и не отвлекать другие части нашего мозга (которые уже могут быть заняты отслеживанием значение d1 и d2, например). 

Конечно, все имеет свою цену. Необходимо изучить операторы и их свойства при применении к разным типам объектов. (Это верно и в математике — для чисел оправдывается x * y == y * x, но такое свойство не распространяется на функции или матрицы, с другой стороны, x+y == y+x (ассоциативный закон) выполняется для всех типов.)

Многих беспокоить вопрос производительности. Считаю, что читабельность на первом месте, а дальше уже идет производительность. Если вернемся к примеру с  d = d1 + d2, мы не увидим каких-то потерь в производительности, по сравнению с версией без операторов. К тому же, существенное преимущество в читабельности. Можно проследить, что в большинстве ситуаций разница в производительности не столь существенна, чтобы жертвовать читабельностью. Для тех случаев, когда вопрос производительности выходит на первый план, вы с легкостью можете превратить версию с операторами на какую либо другую (возможно, путем профилирования).

Добавить комментарий