Множественные ветвления 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 шт):

Автор решения: Maxim Tretyakov
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, соответственно.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Запускаем в голове интерпретатор. Начальные значения:

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 - истина, выполняем "погрызть", покидаем все условные операторы.

→ Ссылка