# Домашнє завдання · 11 · Умови

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Усе завдання робиться **без циклів і без функцій** — їх ще не було. Тільки рівний код
згори вниз, `if / elif / else`, `match / case` і `assert`.

Наскрізний приклад той самий, що в лекції: застосунок, який читає з датчика температуру
й радить, що вдягнути.

---

## 🟢 Рівень 1 — База

Напиши файл `порада.py`, який:

1. має вгорі чотири змінні: `температура`, `вологість`, `стан_датчика`, `місто`;
2. класифікує температуру ланцюжком `if / elif / else` на **пʼять** діапазонів:
   мороз (`< 0`), прохолодно (`< 12`), комфортно (`< 22`), тепло (`< 30`), спека (решта);
3. друкує пораду одним рядком;
4. містить щонайменше **три** `assert`-и, які перевіряють, що конкретні температури
   потрапляють у конкретні гілки.

Окремо додай коментар на два речення: чому порядок гілок міняти не можна й що станеться,
якщо поставити `температура < 30` першою.

**Зроблено, якщо:** файл запускається без помилок; при значеннях `-5`, `5`, `18`, `25`
і `35` друкуються пʼять різних порад; усі `assert`-и проходять; на питання «скільки умов
обчислив Python при 25 градусах» ти відповідаєш числом і можеш його обґрунтувати.

---

## 🟡 Рівень 2 — Плюс

Додай до того самого файлу **валідацію входу** — блок, який виконується *перед*
класифікацією й розрізняє чотири стани:

| Стан | Як розпізнати |
|---|---|
| значення немає | `температура is None` |
| датчик збрехав | значення поза межами `-90 … 70` |
| назви міста немає | `місто is None` |
| назва міста порожня | `місто` порожнє або самі пробіли |

Головна вимога: **`None` і порожній рядок мусять потрапляти в різні гілки**. Перевір це
`assert`-ами — обидва входи хибні за істинністю, тому одним `if not місто:` їх не
розрізнити.

Потім додай два вирази з коротким замиканням і поясни коментарем, від якої саме помилки
кожен рятує:

- середня температура: `кількість != 0 and сума / кількість > 15`;
- перша літера назви: `місто and місто[0]`.

**Зроблено, якщо:** на вході `температура = None` програма пише «датчик мовчить» і **не
доходить** до порівняння з нулем; на вході `температура = 200` пише про поламаний датчик;
на вході `місто = "   "` і `місто = None` друкуються **різні** повідомлення; при
`кількість = 0` програма не падає, а `assert` підтверджує, що результат — `False`.

---

## 🔴 Рівень 3 — Виклик

Одне вимірювання може приїхати в трьох формах:

```python
[23.5, 60]                  # список: температура й вологість
{"t": 23.5, "h": 60}        # словник
23.5                        # просто число, вологості немає
```

Напиши **дві** версії розбору, які зводять будь-яку з цих форм до пари
`(температура, вологість)`, підставляючи `None` замість відсутньої вологості:

1. через `match / case` — зі зразками для списку, словника й числа, і зі **сторожем**
   `if t > 40`, який окремо позначає підозріло гарячі значення;
2. через ланцюжок `elif` з `isinstance` і `len` — без `match`.

Далі порівняй їх `assert`-ами на всіх трьох входах плюс на одному свідомо зіпсованому
(наприклад, `"двадцять три"`).

**Зроблено, якщо:** обидві версії дають однаковий результат на всіх чотирьох входах, це
підтверджено `assert`-ами; ти можеш назвати рядок, у якому версія на `elif` довша, і
пояснити словами, чому саме там легше помилитись. Додатково: наведи приклад входу, на
якому версія з `match` спрацює правильно, а версія на `elif` — ні, якщо в ній забути
`isinstance`.

---

## Підказки

- Порядок гілок — частина логіки, а не оформлення. Спершу питай про **наявність**
  значення (`is None`), потім про його **коректність** (діапазон), і лише потім про
  **величину**.
- Якщо дві перевірки виглядають однаково, а поводяться по-різному, перевір їх на нулі
  й на порожньому рядку: саме там `not x` і `x is None` розходяться.
- Голе імʼя в `case` — це захоплення, а не порівняння. Щоб перевірити тип у зразку, є
  форма `case float(t)`: вона й тип перевірить, і одразу дасть значенню імʼя.
- `assert` без повідомлення теж працює, але повідомлення — це половина користі:
  `assert одяг == "светр", "5 °C має потрапляти в другу гілку"`.
- Якщо `IndentationError` вказує на рядок, де все виглядає правильно, дивись на **рядок
  вище**: інтерпретатор називає місце, де зрозумів помилку, а не де ти її зробив.
