Кто на первом?

Головоломка Python

Вы помогаете своему племяннику с домашним заданием по математике. Домашнее задание касается показателей. Чтобы произвести на него впечатление — вы открываете командную строку Python и пишете:

Что? Вы решаете изучить эту проблему позже. А пока ты приносишь ручку и бумагу и продолжаешь помогать своему племяннику. После того, как ваш племянник пойдет домой (все домашние задания он сделает), у вас появится идея. Вы открываете приглашение Python и пишете:

Ах! Порядок действий, вот что происходит. В Python оператор ** предшествует оператору -. Что делает Python, так это -(2**2). Теперь это имеет смысл.

Возможно, вы помните аббревиатуру PEMDAS из школы, которая означает круглые скобки, показатели степени, умножение/деление, сложение/вычитание. В Python больше операторов, и хотя их порядок хорошо определен, его сложно запомнить.

Некоторые языки используют префиксную нотацию, и тогда вам не нужно запоминать приоритет оператора. Вот тот же код на обычном Лиспе (sbcl):

Однако писать математику в такой форме неестественно. Выражение 2*3+4 записывается в префиксной записи как (+ (* 2 3) 4) — проще для компьютеров, но сложнее для нас, людей.

В Python большую часть времени вам не нужно заключать все в скобки. Но в некоторых случаях вам нужно будет использовать круглые скобки, чтобы заставить код «вести себя». Обязательно протестируйте свой код! К счастью для вас, Python поставляется с интерактивной подсказкой, так что вы можете быстро проверить свое предположение.

Вы также можете использовать модуль ast, чтобы увидеть синтаксическое дерево, которое Python строит из вашего кода. Вот пример использования ast из командной строки:

Вы можете видеть, что UnaryOp (-) обертывает BinOp (**).

Еще один инструмент, который вы можете попробовать, — черный, который автоматически форматирует ваш код.
Если вы запустите black в коде, содержащем -2**2, черный преобразует его в -(2**2).

Как и в математике, в программировании важен порядок операций. Старайтесь время от времени освежать в памяти порядок действий, а если сомневаетесь — используйте скобки :)

Если вам нравится решать задачи по программированию, ознакомьтесь с книгами Мики Тебека «Дразнилки для ума» на The Pragmatic Bookshelf. Вы можете сэкономить 35% на электронных версиях книг с промокодом brain_teasers_35 до 15 мая 2022 года: