Что значит n% и как работает выражение n%9 or n and 9 в целом?

def digital_root(n):
    print(n%9 or n and 9)

Ответы (1 шт):

Автор решения: S.H.

Мне в комментариях указали на ошибку в моих рассуждениях, поэтому я переписал ответ. И, фактически, автором ответа является dIm0n ( https://ru.stackoverflow.com/users/398802/dim0n )

Давайте попробуем разобрать это выражение вместе.

% - это операция остаток от деления. Например, 19%5 = 4

or - это или, and - это и.

И здесь начинается самое интересное, а именно: "В языке Python операторы and и or, как вы и ожидали, выполняют булевы операции, но они не возвращают булевы значения: результатом всегда является значение одного из операндов.

Для оператора and: При использовании оператора and, значения вычисляются в булевом контексте слева напрво. Значения 0, '', [], (), {} и None являются ложью, все остальное является истиной

Если какой-либо из операндов является ложью, результатом будет первое такое значение.

Если все значения являются истиной, так что в результате мы получаем последнее значение.

Аналогично для оператора or: при вычислении значения цепочки переменных, связанных or, будет возвращено значение первого операнда, который интерпретируется как "истина". (в случае чисел - первого ненулевого операнда). Если ВСЕ операнды в цепочке - ложь, то будет возвращено значение последнего"

Ну, и еще у нас есть приоритет операций. Приритет операций описан в разделе 6.17 доков по третьему питону, и, как и ожидаемо, сначала по приоритету идет вычисленеи остатка от деления, потом по приоритету идет and и наконец по риоритету следует or

Теперь смотрим, как это практически работает.

Сначала будет вычислен остаток от деления. Промежуточно назовем его my_mod

А потом, так как следующим выражением является or, происходит такой фокус: если my_mod не равен нулю - мы заканчиваем вычисления. И результатом вычислений будет my_mod.

Для меня лично это был довольно токий момент. (не совсем то, чего ожидаешь, когда знаешь, что у and приоритет выше.)

А вот если my_mod равно нулю - вот тогда будет вычислено (n and 9), в результате получим 9, если n>0.

Потом, так как my_mod равен нулю, происходит вычисление (my_mod or 9), в результате которого возвращается 9.

Значит, будет возвращен остаток от деления на 9, кроме тех случаев, когда остаток равен нулю. в этих случаях будет возвращенно число 9.

Вообще, в этом вопросе достаточно смысла, чтобы поговорить о нём и понять, понимает ли человек, как работают логические операторы в питоне (я - не понимал, пока не написал ответ :-)

Спасибо dIm0n за подсказки.

→ Ссылка