
Информатика: создаём своего цифрового помощника Урок 31 из 38
Циклы Python, которые умеют остановиться
Заменим три копии одной команды циклом, проследим счётчик и докажем остановку на пустом и непустом списке.
Где мы на карте
Это урок 31 из 72 и часть блока Python (уроки 27–38). Опорная схема показывает проверяемые переходы. Продолжаем бумажный договор версии 0.3: пять исходов напоминания и исходные вымышленные задачи.
Ситуация и вопрос
Пока задач три, можно проверить каждую отдельной строкой. А если задач 300? Цикл повторяет одну проверку для каждого элемента. Но ученик, который не знает, когда повторение заканчивается, может получить программу, которая зависла или пропустила последнюю задачу. Сначала проследим три карточки и пустой список.
Новые слова без пропусков
Список хранит последовательность значений в определённом порядке. for done in values берёт очередное значение из списка; одно выполнение тела цикла называется итерацией. Счётчик total хранит число найденных True. Инвариант — обещание, истинное до и после каждого прохода: total равен числу завершённых карточек среди уже просмотренных. Завершение следует из конечной длины списка: после последнего элемента брать больше нечего. У пустого списка тело не выполняется ни разу, и результат 0.
Опорный сигнал
Вход → проверка правила → изменение состояния → наблюдаемый результат. Покажите пальцем, на каком шаге программа читает данные, где сравнивает их с договором и где только сообщает результат. Если шага не видно на схеме, найдите его в коде и добавьте в собственную трассу.
Разбираем шаг за шагом
Положите False, True, False слева направо. После первой карточки total=0, после второй 1, после третьей всё ещё 1. Именно эту трассу печатает код. Затем замените values на []: не появится ни одной строки промежуточного счёта, только Completed: 0. Сравните бумажную таблицу с экраном. В цикле for Python сам переходит к следующему элементу; отдельную позицию увеличивать не нужно.
Предскажите и проверьте
Закройте блок с выводом. По строкам проследите значения имён и напишите точный ожидаемый текст, включая регистр и порядок строк. Только затем выполните код из каталога step-03 командой python3 и сравните посимвольно. Поменяйте один вход; до запуска запишите новый прогноз. Если результат отличается, найдите первую строку расхождения, а не подгоняйте ответ задним числом.
tasks = [{"done": False}, {"done": True}, {"done": True}]
count = 0
for task in tasks:
if task["done"]:
count += 1
print(count)
Ожидаемый вывод
2
Поймайте ошибку
Если написать total = 0 внутри цикла, счётчик будет начинаться заново на каждой карточке. Если увеличить его для каждого элемента без проверки done, вы подсчитаете длину списка, а не число выполненных задач. Создайте контрпример False, False, True для обеих ошибок.
Изменение проекта
Замените бумажный счётчик версии 0.3 функцией count_done. Сравните её с четырьмя контрольными карточками из cases.json; исходные три задачи должны дать 1.
Задание и доказательство
Напишите count_done для списка словарей из проекта. Проверьте четыре случая: пустой список, все False, смесь из трёх и все True. Для смеси покажите каждый промежуточный счёт. Затем уберите печать из функции: она должна возвращать число, чтобы тесты могли сравнить его с ожидаемым.
Перенос в новую ситуацию
Подсчитайте не завершённые задачи, а книги на полке с признаком borrowed=True. Что поменяется в условии и что останется тем же в инварианте? Объясните, почему пустая полка тоже даёт 0.
Возврат через 1, 7 и 30 дней
Через 1 день восстановите правило и один граничный пример без страницы. Через 7 дней объясните ошибку в новом примере однокласснику. Через 30 дней повторите тест проекта, проверьте, что прежние записи и вывод сохранились, и снова перенесите правило на другую задачу.
Следующий урок
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.