Множественные ветвления if в python
Всем привет! Заранее, прошу прощения если не туда попал, я только учусь. :-) В настоящий момент прохожу онлайн курс в Яндекс практикуме. Читаю условия решаю задачи. И вот на моем пути повстречалась следующая задача:
Задача 2 Готовим завтрак. В зависимости от наличия продуктов есть разные варианты меню: Если есть молоко (milk) и хлопья (cereals) — можно позавтракать хлопьями с молоком. Если есть яйца (eggs) — на завтрак будет яичница. Если есть молоко и яйца — можно сотворить омлет. Есть и более бюджетные варианты: попить молока, погрызть сухих хлопьев или вовсе не завтракать. Прочтите код, отследите логику ветвления. Подставьте вместо многоточия такой логический оператор, с которым программа будет работать корректно.
# Продуктов маловато:
milk = not True # Молоко "НЕ есть".
cereals = True # Хлопья есть.
eggs = False # Яиц нет.
# Вставьте логический оператор вместо многоточия.
# Решите, нужно ли расставить скобки.
if milk and cereals or eggs:
if eggs:
if milk:
breakfast = "- омлет"
else:
breakfast = "- яичница"
else:
breakfast = "- хлопья с молоком"
else:
if milk:
breakfast = "- стакан молока"
elif cereals:
breakfast = "можно погрызть сухих хлопьев"
else:
breakfast = "ничего не будет: разгрузочный день"
print("Сегодня на завтрак", breakfast)
Саму задачу решил быстро, путем перебора or и and. Но, интересно понять, как же этот код работает. Мне не понятно, выражение "if milk and cereals or eggs:" Возвращает что-то одно, правду или ложь. Как python делает выбор между аж шести вариантами? Как он понимает, что если нужно выбрать из if - блока правды ветку лжи?
Ответы (3 шт):
if milk and cereals or eggs:
Можно переписать так:
Если (Молока И хлопья) ИЛИ яйца
И и ИЛИ имеют разный приоритет(как умножение и сложение в математике). И имеет приоритет выше, чем ИЛИ, поэтому выполняется раньше.
Операция И возвращает ИСТИНУ только тогда, когда оба операнда являются ИСТИННОЙ Операция ИЛИ возвращает ИСТИНУ, когда хотя бы один операнд является ИСТИННОЙ
Почитайте про алгебру логики: она является частью необходимой базы
if milk and cerals or eggs
сокращение от
if milk==true and cerals==true or eggs==true:
milk, cerals, eggs - логические переменные которые принимают значение True или False, соответственно.
Запускаем в голове интерпретатор. Начальные значения:
milk = False
cereals = True
eggs = False
Как вычислить выражение для ингредиентов?
milk and cereals or eggs
расставляем скобки (в этом примере это не важно, в других может повлиять):
(milk and cereals) or eggs
подставляем значения:
(False and True) or False
вычисляем скобки (нужна таблица истинности для and):
False or False
вычисляем выражение (нужна таблица истинности для or):
False
Значит мы попали в ветку else:
if milk:
breakfast = "- стакан молока"
elif cereals:
breakfast = "можно погрызть сухих хлопьев"
else:
breakfast = "ничего не будет: разгрузочный день"
milk - ложь, пропускаем if. Проверяем elif: cereals - истина, выполняем "погрызть", покидаем все условные операторы.