Menu
Coddy logo textTech

Логические операторы. Часть 4

Часть раздела Fundamentals путешествия по 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 всегда меняет andor, одновременно отрицая каждую часть.

Например:

# Проверка, что человек НЕ является (студентом или трудоустроенным)
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: Иногда требуются условия, сочетающие оба оператора. Вот практический пример:

# Проверка, можем ли мы НЕ принять заявку на работу
# Мы отклоняем, если: (нет опыта И нет диплома) ИЛИ не соответствует возрастным требованиям

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 (отклонено, так как нет опыта И нет диплома)
# Это также можно записать с помощью законов де Моргана:
# accept = (experience ИЛИ degree) И meets age; 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 (есть и лицензия, и место)

Шпаргалка

Законы Де Моргана — правила преобразования логических выражений:

  • not (A and B)(not A) or (not B)
  • not (A or B)(not A) and (not B)

При распределении not: каждый операнд инвертируется, а оператор меняется на противоположный (andor).

# Пример первого закона
result = not (number >= 1 and number <= 10)
result = (not number >= 1) or (not number <= 10)  # эквивалентно

# Пример второго закона
result = not (is_student or is_employed)
result = (not is_student) and (not is_employed)  # эквивалентно

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

# Инициализация переменных

# Расчет условий
can_sell_regular_pet = 
can_sell_exotic_pet = 
cannot_sell_any_pet =

# Не удаляйте строки ниже
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Проверьте себя

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

Все уроки раздела Fundamentals