Чим корисні оператори?

4 хв. читання

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

Чому ж деякі розробники так люблять оператори?

Для математиків оператори виражають хід думок. Візьмемо просту операцію додавання двох чисел та дослідимо її поведінку:

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

Вказана рівність демонструє закон комутативності для операції складання. З операторами запис виглядає коротшим:

x + y == y + x 

Перевага другого варіанту наразі здається незначною.

Тепер розглянемо асоціативний закон:

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

Перепишемо рівність з використанням операторів:

x + (y + z) == (x + y) + z

Виглядає менш заплутано і дозволяє зробити висновок, що дужки тут непотрібні. Тому ми можемо записати без неоднозначності:

x + y + z

Більшість інших законів також легше записати, використовуючи оператори. Ось ще один приклад ідентичності результату:

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

Порівняйте з такою формою запису:

x + 0 == 0 + x == x 

Основний сенс тут: якщо ви один раз засвоїли позначення операторів, то рівності, записані таким чином краще сприймаються, ніж варіант запису з функціями. Усе тому що при роботі з операторами наш мозок застосовує різні механізми сприйняття, тобто так ефективніше.

Мабуть, всі погодяться з твердженням, що формули, записані з операторами краще сприймаються: так залучаються механізми візуального сприйняття мозку. Такий процес відбувається підсвідомо, але завдяки йому ми розуміємо що насправді бачимо. Наприклад, «стілець», а не «шматки дерева, з'єднані певним чином». Запис у вигляді функцій залучає інші відділи нашого мозку, менш підсвідомі (Це пов'язано з читанням і розумінням прочитаного. Звичайно, людина опановує таку навичку пізніше, ніж вміння візуально сприймати інформацію).

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

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

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

Порівняймо з такою формою запису:

 n * (x + y) == n * x + n * y 

Помітьте, тут ми використали відносний пріоритет операцій. Часто математики записують ще коротше:

n(x+y) == nx + ny 

але, на жаль, в даний час це виходить за межі можливостей парсера Python.

Оператори мають ще одну потужну перевагу: їх зручно використовувати з об'єктами різних типів. Наприклад, загадані вище закони все ще справджуються, коли x, y та z — вектори однакового розміру, а n— скаляр (замініть літерал 0 вектором з нулів). Те ж саме з матрицями (n повинен бути скаляром).

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

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 1.6K
Приєднався: 1 рік тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід