McBin

Сложные условия: elif и логические связки | Урок 4

# УРОК: Сложные условия: elif и магия логики

Привет! 👋 Готов прокачать свои скрипты?

До этого момента твои программы были похожи на простейший выключатель света: либо **ВКЛ** (`if`), либо **ВЫКЛ** (`else`). Но реальная жизнь (и крутые игры) устроена сложнее.

Представь, что ты пишешь бота для RPG-игры. Герой встречает дракона. Если у героя есть меч — он атакует. А если меча нет, но есть магия? А если нет ни того, ни другого, но он умеет быстро бегать? Обычный `if-else` тут превратится в запутанную кашу.

Сегодня мы научимся строить **сложную логику**, чтобы твои программы могли принимать умные решения, учитывая множество факторов одновременно.

---

## Часть 1: `elif` — Когда вариантов больше двух

В Python `elif` — это сокращение от **"else if"** (иначе если). Это твой способ сказать программе: "Первый план не сработал? Окей, проверь вот этот, второй план".

### Аналогия: Светофор 🚦
Представь светофор. У него не два состояния, а три.
1.  **Если** горит красный — стой.
2.  **Иначе если** горит желтый — готовься.
3.  **Иначе** (зеленый) — едь.

Если бы мы использовали только `if` и `else`, нам пришлось бы писать вложенные условия, которые выглядят ужасно. С `elif` это выглядит элегантно:

```python
color = "желтый"

if color == "красный":
    print("Стоять! 🛑")
elif color == "желтый":
    print("Готовься... ⚠️")
elif color == "зеленый":
    print("Поехали! 🚀")
else:
    print("Светофор сломан, действуй по ситуации.")
```

**Важное правило:** Python проверяет условия сверху вниз. Как только он находит **первое** правдивое условие (`True`), он выполняет его блок кода и **пропускает** все остальные `elif` и `else`.

---

## Часть 2: Логические связки (Операторы)

Иногда одного условия мало. Тебе нужно проверить сразу несколько вещей. Например, чтобы купить игру в Steam с рейтингом 18+, у тебя должны быть:
1.  Деньги на карте.
2.  **И** возраст больше 18 лет.

Для этого в Python есть три мушкетера логики: `and`, `or`, `not`.

### 1. Оператор `and` (И) — Строгий охранник 👮‍♂️
Этот оператор требует, чтобы **оба** условия были правдой. Если хотя бы одно ложно — всё выражение ложно.

*   Есть билет **and** есть паспорт -> Проходи.
*   Есть билет, но нет паспорта -> Не проходишь.

```python
money = 1000
age = 16

# Игра стоит 500, рейтинг 18+
if money >= 500 and age >= 18:
    print("Покупка успешна! 🎮")
else:
    print("Ошибка: либо нет денег, либо ты слишком молод.")
```

### 2. Оператор `or` (ИЛИ) — Добрый друг 🤝
Ему достаточно, чтобы **хотя бы одно** условие было правдой.

*   Ты сделал домашку **or** помыл посуду? -> Молодец, можешь гулять.

```python
is_weekend = False
is_holiday = True

# Отдыхаем, если выходной ИЛИ праздник
if is_weekend or is_holiday:
    print("Ура, в школу не надо! 🛌")
else:
    print("Вставай, пора на урок...")
```

### 3. Оператор `not` (НЕ) — Бунтарь 🙃
Он просто переворачивает значение. `True` превращает в `False`, и наоборот. Это полезно, когда удобнее проверить, что чего-то **НЕ** случилось.

```python
is_banned = False

if not is_banned:
    print("Добро пожаловать на сервер!")
else:
    print("Доступ запрещен.")
```

---

## Практические примеры

Давай посмотрим, как это работает в "боевых" условиях.

### Пример 1: Система оценок (Классика `elif`)
Представь, что ты пишешь электронный журнал. Тебе нужно перевести баллы (0-100) в оценку (5, 4, 3, 2).

```python
score = int(input("Введите баллы за тест (0-100): "))

if score >= 90:
    print("Твоя оценка: 5! Отлично! 🌟")
elif score >= 75:
    print("Твоя оценка: 4. Хорошо.")
elif score >= 50:
    print("Твоя оценка: 3. Надо подтянуть.")
else:
    print("Твоя оценка: 2. Увидимся на пересдаче. 💀")
```
*Обрати внимание:* Нам не нужно писать `elif score >= 75 and score < 90`. Почему? Потому что если бы баллов было 95, сработал бы первый `if`, и до второго `elif` программа бы просто не дошла. Порядок важен!

### Пример 2: Вход в систему (Комбинация `and` и `not`)
Простейшая имитация логина на сайт.

```python
correct_login = "admin"
correct_pass = "12345"
is_account_locked = False # Аккаунт не заблокирован

user_login = input("Логин: ")
user_pass = input("Пароль: ")

# Проверяем: логин совпал И пароль совпал И аккаунт НЕ заблокирован
if user_login == correct_login and user_pass == correct_pass and not is_account_locked:
    print("Доступ разрешен. Добро пожаловать, Админ.")
elif user_login == correct_login and user_pass == correct_pass and is_account_locked:
    print("Пароль верный, но ваш аккаунт заморожен службой безопасности.")
else:
    print("Неверный логин или пароль.")
```

### Пример 3: Механика игры (Использование скобок)
В сложных условиях можно использовать скобки `()`, как в математике, чтобы управлять приоритетом операций.
Герой может открыть сундук, если:
1. У него есть ключ.
2. **ИЛИ** он вор (skill > 50) **И** у него есть отмычка.

```python
has_key = False
skill_level = 60
has_lockpick = True

# (Есть ключ) ИЛИ (Есть навык И есть отмычка)
if has_key or (skill_level > 50 and has_lockpick):
    print("Сундук открыт! Вы нашли сокровища 💎")
else:
    print("Сундук заперт. Нужен ключ или навыки взлома.")
```

---

## 🧠 Это интересно знать

**Факт №1: Джордж Буль и его алгебра**
Тип данных `bool` (True/False) назван в честь математика Джорджа Буля. В 19 веке он придумал систему алгебры, где есть только два значения: 1 и 0 (Истина и Ложь). Тогда это казалось странной философией, а сегодня на "Булевой алгебре" работает каждый компьютер и смартфон в мире.

**Факт №2: Ленивый Python (Short-circuit evaluation)**
Python — "ленивый" язык, и это хорошо!
*   Если в связке `and` первое условие ложное (`False and ...`), Python **даже не будет проверять второе**. Зачем? Ведь результат все равно будет `False`.
*   Если в связке `or` первое условие истинное (`True or ...`), Python не смотрит на второе. Ведь результат уже точно `True`.
Это экономит ресурсы компьютера и позволяет писать более безопасный код.

---

## 🔑 Ключевые моменты (Резюме)

1.  **`elif`** позволяет проверять много условий по очереди. Если одно сработало — остальные игнорируются.
2.  **`and`** возвращает `True`, только если **ВСЕ** условия верны.
3.  **`or`** возвращает `True`, если **ХОТЯ БЫ ОДНО** условие верно.
4.  **`not`** инвертирует значение (делает из правды ложь).
5.  **Порядок имеет значение!** В конструкции `if-elif-else` ставь самые специфичные/редкие условия наверх.
6.  Используй **скобки `()`**, если сочетаешь `and` и `or` в одной строке, чтобы не запутаться.

**Твое задание:** Попробуй написать программу "Чат-бот", который реагирует по-разному на слова "привет", "пока", "как дела", а на все остальное отвечает "Я тебя не понимаю". Удачи! 🚀
Copied to clipboard!