Проект · Занятие 2 из 4День начинается с данных
SilverTests.ruошибки · файлы · меню · своя фишка
Логика и файлы
Занятие 2 — Разбираем, что уже работает, и учим программу не забывать
1Где вы сейчас
После домашней работы у вас должны быть подключены минимум 2 API. Данные приходят, выводятся на экран. В шаблоне вы видели магические слова try, except, status_code — и просто скопировали их, не особо понимая. Сегодня разбираемся, зачем они там, и учим программу запоминать сводку в файл.
2Теория — то, что вы уже видели в шаблоне
Зачем нужен try / except
Программа без try/except — как стеклянный стакан: одна трещина, и всё разлетается. Отключился интернет — падение. Сервер ответил мусором — падение. Пользователь увидит красную простыню ошибки и закроет вашу программу навсегда.
try означает «попробуй сделать». except означает «если не получилось — вот план Б». Программа не паникует, а вежливо пишет «нет связи» и идёт дальше.
try:
response = requests.get(url, timeout=10)
# основной план
except requests.RequestException:
print("Нет связи с сервером") # план Б
Зачем нужен status_code
Сервер может ответить, но ответить плохо. 200 — всё хорошо. 404 — не нашёл. 500 — у сервера самого что-то сломалось. Если не проверить status_code, программа попытается прочитать данные из ошибки и упадёт.
if response.status_code == 200:
data = response.json() # данные пришли, работаем
else:
print("API вернул ошибку:", response.status_code)
Каждый запрос к API должен быть в try/except и проверять status_code. Если одно API упало — остальные блоки должны продолжить работать.
Зачем нужны файлы
Программа без файлов — как человек без памяти. Закрыли — всё забыла. Файл — это тетрадь, в которую программа пишет, чтобы потом перечитать.
with open(filename, "w", encoding="utf-8") as f:
f.write(text)
"w" — режим записи (write). encoding="utf-8" — пиши по-русски, а не закорючками. Без этого вместо «Москва» в файле будет «╨£╨╛╤Б╨║╨▓╨░».
3Охота на баги — разминка
В каждом куске кода ниже спрятана ошибка. Найдите её и скажите, что случится при запуске. Нажмите на карточку, чтобы перевернуть её и проверить себя.
Баг #1↻ нажми, чтобы увидеть ответ
response = requests.get(url)
data = response.json()
print(data["temp"])
Ответ — #1↻ назад
Сразу три проблемы:
• Нет timeout — если сервер «висит», программа зависнет навсегда.
• Нет try/except — без интернета упадёт с красной ошибкой.
• Нет проверки status_code — если сервер ответил ошибкой, ключа "temp" в ответе не будет, и data["temp"] упадёт.
Баг #2↻ нажми, чтобы увидеть ответ
with open("report.txt", "w") as f:
f.write("Сводка за вторник: солнечно")
Ответ — #2↻ назад
Не указана encoding="utf-8". На Windows файл сохранится в системной кодировке, и при открытии получите кракозябры вместо русских букв (что-то вроде ╨бвРРО╨▒РєР░).
Как надо
with open("report.txt", "w", encoding="utf-8") as f:
f.write("Сводка за вторник: солнечно")
Баг #3↻ нажми, чтобы увидеть ответ
filename = "history/" + date.today() + ".txt"
Ответ — #3↻ назад
date.today() возвращает не строку, а объект типа date. Складывать строку с объектом нельзя — Python выдаст TypeError.
Как надо
filename = "history/" + str(date.today()) + ".txt"
Баг #4↻ нажми, чтобы увидеть ответ
try:
response = requests.get(url, timeout=10)
data = response.json()
print(data["current"]["temperature_2m"])
except requests.RequestException:
print("Нет связи")
Ответ — #4↻ назад
Хитрый баг! try/except здесь есть, но он ловит только RequestException — ошибки сети. А если сервер ответил кодом 404 или 500, в data придёт сообщение об ошибке, в нём не будет ключа "current", и программа упадёт с KeyError — который этим except не пойман.
Как надо
try:
response = requests.get(url, timeout=10)
if response.status_code == 200:
data = response.json()
print(data["current"]["temperature_2m"])
else:
print("Ошибка:", response.status_code)
except requests.RequestException:
print("Нет связи")
4Что нужно дописать в шаблоне
Сохранение сводки — функция save_report
В шаблоне каркас уже есть. Главная задача — собрать текст сводки в одну переменную, а потом записать её в файл. Подсказка: можно начать с пустой строки и добавлять к ней через +=.
def save_report():
os.makedirs("history", exist_ok=True)
filename = "history/" + str(date.today()) + ".txt"
# ЗАДАНИЕ: собери текст сводки в переменную text
text = "Сводка за " + str(date.today()) + "\n"
text += "=" * 30 + "\n"
# ... добавь сюда погоду, валюты, свои блоки
with open(filename, "w", encoding="utf-8") as f:
# ЗАДАНИЕ: запиши text в файл
pass
print("Сохранено:", filename)
Подвох: ваши функции show_weather и другие сейчас печатают текст через print. А в файл нужно записать. Как быть? Обсудите с учителем — есть несколько решений.
Загрузка истории — функция load_history
Эту функцию пишете сами по аналогии с save_report. Что нужно: спросить дату, собрать имя файла, проверить через os.path.exists, что файл существует, и если да — открыть и напечатать. Если нет — сказать «нет сводки за такую-то дату».
def load_history():
d = input("Введите дату (ГГГГ-ММ-ДД): ").strip()
filename = "history/" + d + ".txt"
# ЗАДАНИЕ: проверь, есть ли такой файл (os.path.exists)
# если есть — открой на чтение ("r") и напечатай содержимое
# если нет — напиши пользователю, что сводки за этот день нет
Меню — вызовы функций
В шаблоне в меню стоят комментарии «какую функцию вызываем?» вместо вызовов. Допишите — это одна строка в каждом elif.
5Своя фишка — на отдельный балл
Базовая программа — это техника. Но скучную программу никто не запускает дважды. Добавьте хотя бы одну идею из списка — или придумайте свою.
A
Дневник дня. Перед сохранением программа спрашивает «Как настроение?» или «Что запомнилось?» — ответ дописывается в файл вместе с данными. Через неделю можно открыть и почитать, как прошло.
B
Умное имя файла. Не просто 2026-04-15.txt, а 2026-04-15_солнечно_+12.txt — метка строится из данных погоды.
C
Личная шапка сводки. ASCII-арт, девиз, эмодзи, подпись в конце. Свой стиль — чтобы файл был узнаваемый.
D
Утренний совет. Свой список из 5–10 фраз (своих, не из API!), random.choice выбирает одну при запуске. «Не забудь зонт», «Позвони бабушке», «Сегодня математика — повтори дроби».
E
Умная интерпретация. Не просто «3°C», а «холодно, надень шапку». Не просто «95 рублей за доллар», а «доллар вырос — копи рубли». Программа не показывает данные, а делает выводы.Сложнее остальных — для тех, кто быстро справился с базой.
6План занятия (80 мин)
- Показать учителю домашнюю работу (5 мин)
- Разбор: зачем в вашем коде try/except и status_code, демо «как ломается без них» (8 мин)
- Дописать try/except и status_code во все блоки, если ещё не везде (5 мин)
- Охота на баги — 4 кусочка у доски (8 мин)
- Теория файлов: with open, encoding, и подвох с print vs return (8 мин)
- Дописать save_report и подключить в меню (15 мин)
- Самостоятельно написать load_history по аналогии (12 мин)
- Своя фишка на выбор — реализовать одну из A–E (15 мин)
- Показать учителю результат + домашнее задание (4 мин)
7Что показать учителю в конце урока
Оценка за занятие 2макс. 2
+1
Техника: меню работает, сводка сохраняется в history/, загружается обратно по дате, программа не падает на неверном вводеВсе API в try/except, проверяется status_code, файл с кодировкой utf-8
+1
Своя фишка: реализована хотя бы одна идея из A–E (или своя, согласованная с учителем) — и она реально работаетНе «добавил переменную», а заметная и осмысленная фишка
0
Нет прогресса с прошлого раза
- Все API в try/except, программа не падает без интернета
- Меню работает: обновить, сохранить, история, выход
- Сводка сохраняется в файл и загружается обратно
- Программа не падает при вводе букв вместо цифр
- Реализована своя фишка — и она работает
8Домашняя работа к занятию 3
Обязательно: пройти тренажёр «Охота на баги» — 10 заданий на поиск и исправление ошибок в API-коде. К каждому заданию — разбор, исправленная версия и тест-кейс. На занятии 3 вы будете тестировать программу соседа — без этого тренажёра не поймёте, что искать. После тренажёра будет контрольный тест.
- Пройти тренажёр «Охота на баги» (все 10 заданий, с разборами)
- Оформление своего проекта: рамки (
colorama, псевдографика), цвет, выравнивание
- Протестировать свою программу: отключить интернет, ввести ерунду — всё должно выжить
- Начать писать
README.md