
Информатика: создаём своего цифрового помощника Урок 24 из 26
Функция как обещание: вход, результат и условия
Выделим проверку срока в отдельную функцию с ясным входом, выходом и поведением при ошибке.
Где мы на карте
Это третий блок одного проекта. Мы пользуемся данными версии 0.2, но пока описываем действия на бумаге: так можно обнаружить ошибку до написания Python.
Ситуация и вопрос
Один и тот же вопрос «пора ли напомнить?» понадобился в списке задач и в карточке задачи. Если скопировать правило дважды, через месяц исправят только одну копию. Нужна одна функция и письменный договор о её поведении.
Новые слова без пропусков
Функция — названная часть алгоритма, которая получает вход и возвращает результат. Параметр — имя входа внутри описания; аргумент — конкретное переданное значение. Возвращаемое значение — ответ функции, не обязательно сообщение на экране. Предусловие описывает, какие входы допустимы. Постусловие описывает гарантированный результат для допустимого входа. Контракт объединяет эти правила и поведение при ошибке. Функция не обязана быть без побочных эффектов, но для простой проверки срока мы явно запрещаем менять файл.
Опорный сигнал
вход + предусловие → одна функция → результат + гарантия
Разбираем шаг за шагом
Опишите should_remind(done, days_to_due). Вход: логическое done и целое число дней либо отсутствие срока. Выход: одно из REMIND, NOT_YET, OVERDUE, NO_DATE, DONE. Порядок: если done=true, вернуть DONE; иначе если срока нет, NO_DATE; иначе если дней меньше 0, OVERDUE; иначе если не более 2, REMIND; иначе NOT_YET. Для (false,2) ответ REMIND, для (false,3) — NOT_YET, для (true,2) — DONE. Файл при вызове не изменяется. Это важная гарантия: экран может спрашивать функцию сколько угодно раз.
Проверка руками
Пусть одноклассник играет роль функции: вы передаёте карточки done и days_to_due, он возвращает ровно одну карточку ответа. Начните с done=true, days_to_due отсутствует: ответ DONE, потому что завершённость проверяется раньше срока. Затем передайте done=false, days_to_due отсутствует: теперь NO_DATE. Нарисуйте стрелку возврата для каждого случая. Если партнёр пытается вернуть два ответа или молчит, уточните договор функции. Функция не должна изменять исходную задачу ради ответа.
Предскажите и проверьте
Каков ответ (false,-1)? OVERDUE; (false,None)? NO_DATE; (true,None)? По выбранному порядку DONE. Если ученик предпочитает сообщать NO_DATE даже для завершённой задачи, это другой допустимый контракт, но его нужно записать и одинаково применять везде.
Поймайте ошибку
«Функция получает days_to_due, поэтому может молча считать отсутствующий срок нулём». Ноль означает сегодня, а отсутствие означает неизвестно. Смешение даёт ложные напоминания. Исправьте тип входа или добавьте отдельную ветку.
Перенос в новую ситуацию
Опишите функцию count_done(tasks) с входом «список задач» и выходом «целое число». Её предусловие требует, чтобы у каждой записи done было логическим значением. Постусловие: результат между 0 и длиной списка; сам список не меняется.
Изменение проекта
В ALGORITHM-ru.md добавьте контракт should_remind: таблицу входов, пять возможных выходов, правило отсутствующего срока и гарантию «не меняет файл». Свяжите его с ветвлением урока 22 и тремя проверками границы.
Задание и доказательство
Дайте другому ученику только контракт. Он должен предсказать пять результатов, не глядя на вашу схему. Затем поменяйте порядок двух проверок и найдите вход, на котором ответ меняется. Доказательство — контракт и контрпример.
Возврат через 1, 7 и 30 дней
Завтра различите параметр и аргумент. Через семь дней напишите контракт для другой задачи. Через месяц сверяйте поведение Python-функции с обещанными случаями.
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.