Вот простая программа выводящая кол-во сообщений.
Путем перебора я сделал программу правильной, но хотелось бы основательно разобраться, чтобы в будущем быстрее решать подобные задачи.
В первую очередь интересует 7 строка:
elif remainder == 0 or remainder > 4 or messages_count >= 11 and messages_count <= 19:
Как именно следует "читать" порядок логический операций и как они себя ведут в зависимости от условий? Изначально я хотел написать "если Х=0 или Х>4 и Y>=11 и Y<=19, то..."
То есть так, как это бы звучало в русском языке.

Читай документацию к питону, у некоторых операторов приоритет выше, чем у других, так у оператора and приоритет может быть выше, чем у оператора or. Порядок операции можно изменять при помощи скобок, рекомендую использовать их всегда. Так как в твоём выражении нету скобок, и операции могут выполняться в соответствии с их спецификацией, то сначала выполнится операция and, messages_count >= 11 and messages_count <= 19 это выражение даст TRUE в том случае если переменная содержит числа в диапазоне от 11 до 19, иначе вернет FALSE, затем выполнится уже remainder == 0 or remainder > 4 это часть выражение выдаст TRUE если хотя одно из этих сравнений выдаст TRUE, а если оба ложные, то вернет FALSE. Как только получен итоговый логический результат обоих выражение, выполнится последняя операция or которая стоит между обоими этими выражениями. Для ясности кода всегда используй скобки в выражениях, сейчас ты написал код и думаешь что он выполняется слева направо, а на самом деле он может выполняться в ином порядке, порядок операций зависит от специфичности оператора и ассоциативности, некоторые операторы большинство всех выполняются слева направо, а вот присваивание наоборот выполняется справа налево.
Сначала производятся математические операции (с вполне школьным порядком приоритетов), потом сравнения, потом AND, потом OR.
А если сообщений будет больше сотни?
remainder = massages_count % 10
if messages_count == 0:
~~print('У вас нет новых сообщений')
elif messages_count // 10 % 10 == 1:
~~print('У вас', messages_count, 'новых сообщений')
elif remainder == 1:
~~print('У вас', messages_count, 'новое сообщение')
elif remainder in [2, 3, 4]:
~~print('У вас', messages_count, 'новых сообщения')
else:
~~print('У вас', messages_count, 'новых сообщений')
Если хочешь уменьшить кол-во веток, то:
if messages_count == 0:
~~print('У вас нет новых сообщений')
elif messages_count // 10 % 10 == 1 or remainder in [0, 5, 6, 7, 8, 9]:
~~print('У вас', messages_count, 'новых сообщений')
elif remainder == 1:
~~print('У вас', messages_count, 'новое сообщение')
else:
~~print('У вас', messages_count, 'новых сообщения')
Меня тоже интересует...
remainder == 0 or remainder > 4 or messages_count >= 11 and messages_count <= 19 - это два OR и один AND.
Ниже написано: "если Х=0 или Х>4 и Y>=11 и Y<=19, то..." - это ОДИН OR и ДВА AND.
Не сходится счёт!
Заодно, сомневаешься - добавь скобки.