Усе завдання робиться без циклів і без функцій — їх ще не було. Тільки рівний код
згори вниз, if / elif / else, match / case і assert.
Наскрізний приклад той самий, що в лекції: застосунок, який читає з датчика температуру й радить, що вдягнути.
рівень 1Рівень 1 — База
Напиши файл порада.py, який:
- має вгорі чотири змінні:
температура,вологість,стан_датчика,місто; - класифікує температуру ланцюжком
if / elif / elseна пʼять діапазонів: мороз (< 0), прохолодно (< 12), комфортно (< 22), тепло (< 30), спека (решта); - друкує пораду одним рядком;
- містить щонайменше три
assert-и, які перевіряють, що конкретні температури потрапляють у конкретні гілки.
Окремо додай коментар на два речення: чому порядок гілок міняти не можна й що станеться,
якщо поставити температура < 30 першою.
Зроблено, якщо: файл запускається без помилок; при значеннях -5, 5, 18, 25
і 35 друкуються пʼять різних порад; усі assert-и проходять; на питання «скільки умов
обчислив Python при 25 градусах» ти відповідаєш числом і можеш його обґрунтувати.
рівень 2Рівень 2 — Плюс
Додай до того самого файлу валідацію входу — блок, який виконується перед класифікацією й розрізняє чотири стани:
| Стан | Як розпізнати |
|---|---|
| значення немає | температура is None |
| датчик збрехав | значення поза межами -90 … 70 |
| назви міста немає | місто is None |
| назва міста порожня | місто порожнє або самі пробіли |
Головна вимога: None і порожній рядок мусять потрапляти в різні гілки. Перевір це
assert-ами — обидва входи хибні за істинністю, тому одним if not місто: їх не
розрізнити.
Потім додай два вирази з коротким замиканням і поясни коментарем, від якої саме помилки кожен рятує:
- середня температура:
кількість != 0 and сума / кількість > 15; - перша літера назви:
місто and місто[0].
Зроблено, якщо: на вході температура = None програма пише «датчик мовчить» і не
доходить до порівняння з нулем; на вході температура = 200 пише про поламаний датчик;
на вході місто = " " і місто = None друкуються різні повідомлення; при
кількість = 0 програма не падає, а assert підтверджує, що результат — False.
рівень 3Рівень 3 — Виклик
Одне вимірювання може приїхати в трьох формах:
[23.5, 60] # список: температура й вологість
{"t": 23.5, "h": 60} # словник
23.5 # просто число, вологості немає
Напиши дві версії розбору, які зводять будь-яку з цих форм до пари
(температура, вологість), підставляючи None замість відсутньої вологості:
- через
match / case— зі зразками для списку, словника й числа, і зі сторожемif t > 40, який окремо позначає підозріло гарячі значення; - через ланцюжок
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вказує на рядок, де все виглядає правильно, дивись на рядок вище: інтерпретатор називає місце, де зрозумів помилку, а не де ти її зробив.