Для математиков операторы важны для их мышления. Возьмите простую операцию, например, добавление двух чисел, и попробуйте изучить некоторые из ее поведения.
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) также работают, когда x
, y
и 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
, мы не увидим каких-то потерь в производительности, по сравнению с версией без операторов. К тому же, существенное преимущество в читабельности. Можно проследить, что в большинстве ситуаций разница в производительности не столь существенна, чтобы жертвовать читабельностью. Для тех случаев, когда вопрос производительности выходит на первый план, вы с легкостью можете превратить версию с операторами на какую либо другую (возможно, путем профилирования).