Menu
CoddyTech

Логические операторы. Часть 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 (тот же результат, другая логика)

Когда использовать законы де Моргана:

  • Чтобы упростить чтение отрицательных условий
  • Чтобы упростить сложные логические выражения
  • Чтобы преобразовать одну форму представления логики в другую
challenge icon

Задание

Новичок

Вы помогаете зоомагазину создать систему, которая определяет, можно ли продать питомца покупателю.

Инициализируйте следующие переменные:

  • has_license со значением True
  • has_space со значением True
  • has_experience со значением False

Напишите логические выражения, чтобы определить, можно ли:

  • can_sell_regular_pet: Покупатель может купить обычного питомца, если у него есть лицензия ИЛИ опыт, И при этом у него должно быть место
  • can_sell_exotic_pet: Покупатель может купить экзотического питомца, если у него есть лицензия И опыт, И при этом у него должно быть место
  • cannot_sell_any_pet: Магазин НЕ МОЖЕТ продать ни одного питомца, если у покупателя НЕТ лицензии И НЕТ опыта ИЛИ у него НЕТ места

Ожидаемые результаты с заданными значениями:

  • can_sell_regular_pet: True (есть лицензия и место)
  • can_sell_exotic_pet: False (нет опыта)
  • cannot_sell_any_pet: False (есть и лицензия, и место)

Попробуйте сами

# Инициализируйте переменные

# Вычислите условия
# Замените каждое значение-заполнитель ниже правильным логическим выражением
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)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Python