and, or, not в Python: сложные логические условия
Автор: Казачкин Даниил Михайлович · Обновлено
Операторы and, or и not работают с логическими выражениями. and требует истинности обеих частей, or — хотя бы одной, not меняет логическое значение на противоположное. Python сначала выполняет not, затем and, затем or, но скобки часто лучше показывают задуманный смысл.
Допуск по возрасту и билету
age = 14
has_ticket = True
with_adult = False
can_enter = has_ticket and (age >= 16 or with_adult)
print(can_enter)Ожидается:
FalseБилет есть, но посетитель младше 16 лет и сопровождающего нет. Если with_adult заменить на True, выражение в скобках и весь результат станут истинными.
Короткое вычисление
При and Python не вычисляет правую часть, если левая уже ложна. При or правая часть пропускается, если левая истинна. Это называется short-circuit evaluation и позволяет безопасно написать text != '' and text[0] == '#': индекс используется только для непустой строки.
Частая ошибка диапазона — number >= 10 or number <= 20. Такое условие истинно почти для любого числа. Для попадания одновременно между двумя границами нужен and или цепочка 10 <= number <= 20. Другая ошибка — сравнивать ввод с True: строка 'yes' сама не является логическим значением; сначала вычислите answer == 'yes'.
Матрица из четырёх случаев
Программа должна разрешать сдачу оборудования, если пользователь совершеннолетний и у него есть пропуск, либо если присутствует преподаватель. Запишите выражение со скобками. Проверьте четыре комбинации, меняя значения переменных, и составьте таблицу ожидаемых True/False. Затем найдите отрицание условия через not и выведите should_refuse. Убедитесь, что can_enter и should_refuse всегда противоположны.
Приоритет логических операций
Запишите три выражения с одинаковыми переменными, но разными скобками: ticket and age_ok or teacher, ticket and (age_ok or teacher), (ticket and age_ok) or teacher. Подставьте несколько комбинаций True и False и найдите случаи, где результаты различаются. Затем подтвердите их запуском Python. Не полагайтесь на память о приоритете, если скобки выражают бизнес-правило яснее. Для короткого вычисления создайте пустую строку и проверьте безопасное условие text and text[0] == '#'. Объясните, почему правая часть не вызвала IndexError и какое значение вернуло всё выражение.
Практикум: логика скидки и законы де Моргана
Скидка действует, если покупатель школьник или пенсионер, сумма не меньше 1000 и товар не входит в исключения. Создайте именованные признаки и восемь тестов, меняя по одному фактору. Запишите положительное правило и условие отказа через not, затем раскройте отрицание по законам де Моргана. Сравните результаты программно для всех комбинаций. Обязательно включите сумму 999 и 1000. Скобки должны отражать предметный смысл, а не только технический приоритет операций.
Контрольная точка
Вычислите правило для школьника с суммой 1200 и исключённым товаром по частям. Затем объясните, почему not school or pensioner отличается от not (school or pensioner).
Частые вопросы
Возвращают ли and и or только True или False?
В Python эти операторы могут возвращать один из операндов из-за короткого вычисления. В школьных условиях лучше объединять явно логические выражения, чтобы результат и смысл оставались предсказуемыми.