Домашнє завдання

11 · Умови

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

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


рівень 1Рівень 1 — База

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

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

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

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


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

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

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

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

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

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


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

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

[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.


Підказки