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

  • 25 марта, 14:50
  • 3982
  • 0

Перевод заметки Гвидо ван Россума, создателя Python, про полезности операторов.

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

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

    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) == n * x + n * y (5a) 
Обратите внимание, что здесь также используются относительные приоритеты операторов. Часто математики пишут это еще более компактно: 

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


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

IT Новости

Смотреть все