Кто на первом?
Головоломка 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 года: