
Информатика: создаём своего цифрового помощника Урок 33 из 38
Текст, даты и казахский Unicode
Сохраним казахский текст без потерь и превратим дату из строки в календарное число дней до срока.
Где мы на карте
Это урок 33 из 72 и часть блока Python (уроки 27–38). Опорная схема показывает проверяемые переходы. Продолжаем бумажный договор версии 0.3: пять исходов напоминания и исходные вымышленные задачи.
Ситуация и вопрос
В задаче записано «Әліппе оқу». После сохранения вместо Ә появилась непонятная последовательность, а срок 2026-10-11 кто-то назвал «два дня», не указав сегодняшнюю дату. Это две разные ошибки: потеря символов и неоговорённый отсчёт. Разберём обе на данных, которые каждый может повторить.
Новые слова без пропусков
Unicode сопоставляет символам кодовые точки; это позволяет хранить Ә и A как разные буквы. UTF-8 — способ записать такие символы байтами; при чтении и записи нужно согласовать кодировку. Строка "2026-10-11" — пока только текст. Дата date — календарный день, для которого Python умеет вычислять разность. ISO-формат YYYY-MM-DD фиксирует порядок год–месяц–день. Часовой пояс определяет, какой сейчас календарный день в месте пользователя. В этом опыте today явно равно 9 октября 2026 года; мы не притворяемся, что срок хранится в старом файле 0.2.
Опорный сигнал
Вход → проверка правила → изменение состояния → наблюдаемый результат. Покажите пальцем, на каком шаге программа читает данные, где сравнивает их с договором и где только сообщает результат. Если шага не видно на схеме, найдите его в коде и добавьте в собственную трассу.
Разбираем шаг за шагом
Напишите на двух карточках 2026-10-09 и 2026-10-11, отметьте между ними два календарных перехода. В коде date.fromisoformat превращает каждую строку в дату, вычитание даёт timedelta, а .days — целое 2. Буква Ә выводится без замены, если исходный файл и терминал используют UTF-8. Измените срок на 2026-02-29: Python отклонит несуществующий день, и это полезная ошибка, а не повод округлять дату.
Предскажите и проверьте
Закройте блок с выводом. По строкам проследите значения имён и напишите точный ожидаемый текст, включая регистр и порядок строк. Только затем выполните код из каталога step-03 командой python3 и сравните посимвольно. Поменяйте один вход; до запуска запишите новый прогноз. Если результат отличается, найдите первую строку расхождения, а не подгоняйте ответ задним числом.
from datetime import date
today = date.fromisoformat("2026-10-09")
due = date.fromisoformat("2026-10-11")
print("Әліппе оқу", (due - today).days)
Ожидаемый вывод
Әліппе оқу 2
Поймайте ошибку
Два календарных дня не всегда означают ровно 48 часов: срок может быть утром, а сейчас вечер. Наш договор версии 0.3 использует именно календарные даты. Для будильника или секундомера понадобятся время суток и часовой пояс; не переносите сюда бездумно тот же расчёт.
Изменение проекта
В версии 1.0 срок будет отдельным полем due_date со строкой ISO-даты или null. Не смешивайте этот формат с числом days_to_due из бумажных тестовых карточек: число вычисляется из даты и выбранного today.
Задание и доказательство
Возьмите три вымышленных названия, одно с Ә, одно с Я и одно с латинской A. Запишите их в UTF-8 и прочитайте вновь без потерь. Для фиксированного today=2026-10-09 рассчитайте сроки 8, 9, 11 и 12 октября: должны получиться −1, 0, 2 и 3. Покажите, как дата 29 февраля 2026 года отвергается до напоминания.
Перенос в новую ситуацию
Расписание международного занятия говорит «10 октября, 09:00», но не называет часовой пояс. Можно ли точно вычислить, сколько часов осталось ученику в Костанае? Объясните, какой недостающий вход надо запросить.
Возврат через 1, 7 и 30 дней
Через 1 день восстановите правило и один граничный пример без страницы. Через 7 дней объясните ошибку в новом примере однокласснику. Через 30 дней повторите тест проекта, проверьте, что прежние записи и вывод сохранились, и снова перенесите правило на другую задачу.
Следующий урок
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.