Статья Автор: Деникина Наталья Владимировна

Логика и файлы

Проект · Занятие 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 мин)
  1. Показать учителю домашнюю работу (5 мин)
  2. Разбор: зачем в вашем коде try/except и status_code, демо «как ломается без них» (8 мин)
  3. Дописать try/except и status_code во все блоки, если ещё не везде (5 мин)
  4. Охота на баги — 4 кусочка у доски (8 мин)
  5. Теория файлов: with open, encoding, и подвох с print vs return (8 мин)
  6. Дописать save_report и подключить в меню (15 мин)
  7. Самостоятельно написать load_history по аналогии (12 мин)
  8. Своя фишка на выбор — реализовать одну из A–E (15 мин)
  9. Показать учителю результат + домашнее задание (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
© SilverTests.ru · Проект · День начинается с данных · Занятие 2
Печать