Логические операторы. Часть 4
Часть раздела Основы путешествия по Python на Coddy. Урок 19 из 77.
При работе с логическими выражениями иногда нужно упростить или преобразовать их. Это особенно полезно при работе со сложными условиями, которые объединяют несколько операторов and и or.
Законы де Моргана задают правила преобразования логических выражений. Эти преобразования помогают сделать код более читаемым и понятным.
Первый закон: not (A and B) — это то же самое, что (not A) or (not B)
Обратите внимание: при распределении not в выражении происходят две вещи: каждый операнд отрицается (A становится not A, B становится not B), и оператор меняется на противоположный: and становится or. not не просто отрицает значения, но и меняет связывающий их оператор.
Например:
# Проверим, что число НЕ находится (между 1 и 10)
number = 15
# Эти два выражения эквивалентны:
result1 = not (number >= 1 and number <= 10)
result2 = (not number >= 1) or (not number <= 10)
print(result1) # True
print(result2) # TrueВторой закон: not (A or B) — это то же самое, что и (not A) and (not B)
Здесь действует то же правило из двух шагов: каждый операнд отрицается, а оператор меняется на противоположный. На этот раз or становится and. Представь это так: при распределении not операторы and ↔ or всегда меняются на противоположные, а каждая часть отрицается.
Например:
# Проверяем, что человек НЕ является студентом и не работает
is_student = False
is_employed = False
# Эти два выражения эквивалентны:
result1 = not (is_student or is_employed)
result2 = (not is_student) and (not is_employed)
print(result1) # True
print(result2) # TrueСложный пример с AND и OR: Иногда нужны условия, сочетающие оба оператора. Вот практический пример:
# Проверяем, НЕ можем ли мы принять заявление о приёме на работу
# Отклоняем, если: (нет опыта AND нет образования) OR не соответствует возрастному требованию
has_experience = False
has_degree = False
meets_age = True
# Сложное условие с использованием AND и OR
reject_application = (not has_experience and not has_degree) or not meets_age
print(reject_application) # True (отклонено, потому что нет опыта AND нет образования)# Это также можно записать, используя законы де Моргана:
# accept = (experience OR degree) AND соответствует возрастным требованиям; reject = not accept
accept_application = (has_experience or has_degree) and meets_age
reject_application2 = not accept_application
print(reject_application2) # True (тот же результат, другая логика)В Python оператор and имеет приоритет выше, чем or, поэтому a or b and c означает a or (b and c). Чтобы сначала проверить нужную часть, заключи её в скобки: (a or b) and c.
Когда использовать законы де Моргана:
- Чтобы упростить чтение отрицательных условий
- Чтобы упростить сложные логические выражения
- Чтобы преобразовывать одну и ту же логику между разными представлениями
Задание
НовичокВы помогаете зоомагазину создать систему, которая будет определять, можно ли продать питомца покупателю.
Эти переменные уже заданы:
has_licenseсо значениемTruehas_spaceсо значениемTruehas_experienceсо значениемFalse
Напишите логические выражения, чтобы определить, верно ли следующее:
can_sell_regular_pet: покупатель может приобрести обычного питомца, если у него есть ЛИБО лицензия, ЛИБО опыт, И при этом у него должно быть местоcan_sell_exotic_pet: покупатель может приобрести экзотического питомца, если у него есть И лицензия, И опыт, И при этом у него должно быть местоcannot_sell_any_pet: магазин НЕ МОЖЕТ продать ни одного питомца, если у покупателя НЕТ лицензии И НЕТ опыта ИЛИ у него НЕТ места
Попробуйте сами
# Вычислите условия
# Замените каждое значение-заглушку ниже правильным логическим выражением
can_sell_regular_pet = False
can_sell_exotic_pet = False
cannot_sell_any_pet = False
# Не удаляйте строки ниже
print("Can sell regular pet:", can_sell_regular_pet)
print("Can sell exotic pet:", can_sell_exotic_pet)
print("Cannot sell any pet:", cannot_sell_any_pet)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы. Часть 2
Логические операторы. Часть 1Логические операторы. Часть 2Повторение — простая логикаЛогические операторы. Часть 3Логические операторы. Часть 47Калькулятор разделения счёта
Приветственное сообщениеПолучение ввода13Списки: продвинутый уровень
Срезы списков. Часть 1Срезы списков. Часть 2Операторы последовательностейПринадлежность2Переменные
ЧислаСтрокаЛогический типСоглашения об именованииПустые переменныеПовторение — инициализация переменных8Циклы
Цикл forЦикл whileПрерывание циклаПереход к следующей итерацииПовторение: факториалФункция rangeВложенный циклПовторение: динамический ввод3Операторы. Часть 1
Арифметические операторыОператор остатка от деленияСокращённые арифметические операцииПовторение — простая математикаОператоры сравнения6Базовый ввод-вывод
ВыводВывод с переменнымиВводПреобразование типаПовторение — до 120Повторение — истина или ложь9Функции
Объявление функцииАргументыВозврат значенияПовторение — функция SigmaПовторение — функция проверкиЗначения по умолчанию12Перебор последовательностей
Перебор элементовФункция enumerateПеребор строк. Часть 1Перебор строк. Часть 2Потренируйтесь самостоятельно: Онлайн-компилятор Python