Сложные условия: 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` в одной строке, чтобы не запутаться.
**Твое задание:** Попробуй написать программу "Чат-бот", который реагирует по-разному на слова "привет", "пока", "как дела", а на все остальное отвечает "Я тебя не понимаю". Удачи! 🚀