Я понимаю задачу. Но как это написать кодом?
Одна из самых неприятных стадий обучения программированию выглядит так: задачу ты понимаешь, словами решение объяснить можешь — а код не появляется.
Недавно на занятии ученик сформулировал это почти идеально: «Порой понимаю задачу, логически проговариваю, а как код выглядеть будет — не знаю. Особенно условия цикла».
Проблема оказалась не в while
Можно знать, как пишется if. Можно помнить синтаксис while. Можно даже решить десяток типовых задач. Но между человеческой фразой и строкой кода остаётся промежуточный этап: формализация.
Что именно сейчас истинно?
При каком условии действие должно продолжаться?
Что означает отрицание этого условия?
Что программа уже знает после завершения цикла?
Нужно ли вообще писать ещё один if, или это состояние уже гарантировано логикой программы?
Пример 1. Одно и то же условие можно сказать по-разному
Возьмём простую фразу: «количество колонок равно 5». Самая нормальная запись в реальном коде — короткая:
columns == 5
Но для тренировки логики полезно уметь выразить ту же мысль через отрицание. Если число целое, оно равно 5 тогда и только тогда, когда оно НЕ больше 5 и НЕ меньше 5:
not (columns > 5 or columns < 5)
Здесь важно не приучать себя писать длинно. В рабочем коде первая версия лучше. Вторая нужна как тренажёр: она заставляет увидеть, что отрицание относится ко всему выражению, а OR при раскрытии отрицания превращается в AND.
not (A or B) == (not A) and (not B)
not (A and B) == (not A) or (not B)
Разбор задачи №1: дверь открывается только при правильном числе колонок
Условие: дверь открывается, только если columns равно 5. Сначала формулируем прямое условие, затем его отрицательный эквивалент.
columns = int(input())
if columns == 5:
print('Открыто')
else:
print('Закрыто')
Эквивалентная проверка для тренировки:
if not (columns > 5 or columns < 5):
print('Открыто')
else:
print('Закрыто')
Проверка понимания. Почему здесь нельзя просто заменить or на and внутри скобок? Попробуйте подставить 4, 5 и 6 и посмотреть, что получится.
Пример 2. Что уже известно после while?
Представим игру. Пока у героя есть здоровье, он получает урон:
health = 20
while health > 0:
damage = int(input('Урон: '))
health -= damage
print('Game over')
Если цикл завершился обычным способом и внутри нет break, то выражение health > 0 стало ложным. Значит, после цикла нам уже известно: health <= 0.
Поэтому конструкция ниже часто бессмысленна:
while health > 0:
...
if health == 0:
print('Game over')
Более того, health может стать не ровно 0, а, например, -7. Тогда проверка health == 0 вообще не сработает. Вот почему полезно спрашивать не «какой if написать?», а «что уже гарантирует предыдущая конструкция?».
Мой алгоритм перевода фразы в код
Не пишем Python. Одной фразой говорим, когда действие должно происходить.
Выделяем переменные и состояния: здоровье, число попыток, пароль, координата и т. п.
Записываем условие как логическое выражение без тела цикла.
Проверяем условие на 2–3 граничных значениях.
Только после этого строим if или while вокруг уже понятного выражения.
После цикла отдельно проговариваем: что теперь обязательно истинно, если не было break?
Тренировка с разбором
Задача 2. Три попытки на пароль
Пользователь вводит пароль. Пока пароль неверный И попытки ещё есть, программа должна спрашивать снова.
Шаг 1. Продолжать цикл нужно при двух одновременно истинных фактах: пароль неправильный; попытки остались.
secret = 'python'
password = ''
attempts = 3
while password != secret and attempts > 0:
password = input('Пароль: ')
attempts -= 1
if password == secret:
print('Добро пожаловать')
else:
print('Попытки закончились')
Здесь финальный if нужен: цикл мог закончиться по двум разным причинам — пароль стал правильным ИЛИ попытки закончились. Нужно различить эти состояния.
Задача 3. Суммируем числа до нуля
Пользователь вводит целые числа. Ноль завершает ввод. Нужно вывести сумму ненулевых значений.
total = 0
number = int(input())
while number != 0:
total += number
number = int(input())
print(total)
Ключевая фраза здесь: «пока число НЕ равно нулю». Сначала рождается условие number != 0, и только затем весь цикл.
Задача 4. Найди лишнюю проверку
n = 10
while n > 0:
n -= 1
if n <= 0:
print('Готово')
Если цикл закончился без break, n > 0 уже ложно, то есть n <= 0 истинно. Проверка ничего не решает — можно сразу печатать «Готово».
Самостоятельные задачи
Сначала проговорите условие словами. Код писать только после этого.
Лифт едет вверх, пока текущий этаж меньше нужного. После каждого шага этаж увеличивается на 1. Вывести этаж, на котором лифт остановился.
Дано число x. Запишите условие «x находится от 10 до 20 включительно» обычным способом и через отрицание условия «x меньше 10 или больше 20».
Пользователь вводит числа до первого отрицательного. Посчитать, сколько неотрицательных чисел было введено.
Есть energy = 50. Каждый ход тратится 7 единиц. Пока энергии больше 0, персонаж может делать ход. Выведите остаток энергии после завершения.
Есть 5 попыток угадать число 7. Цикл должен закончиться либо при правильном ответе, либо когда попытки исчерпаны. После цикла вывести разное сообщение для двух причин.
Домашнее задание
Правило ДЗ. Для каждой задачи сначала написать одну строку по-русски: «цикл продолжается, пока…». Только затем писать код.
Счётчик: вывести числа от 10 до 1 с помощью while.
Копилка: пользователь вводит суммы пополнений. Ввод заканчивается нулём. Вывести итог.
Пароль: запрашивать пароль, пока он неверный. Добавить ограничение в 4 попытки.
Диапазон: переписать x == 12 через not, >, < и логический оператор.
Игра: health = 35, каждый удар задаётся пользователем. После завершения цикла вывести конечное health и объяснить, почему оно не обязано быть равно нулю.
Отладка: придумать пример собственного while, после которого новичок мог бы по привычке написать лишний if. Затем убрать его и объяснить почему.
Главная мысль
Новичку часто не нужен ещё один список синтаксических конструкций. Ему нужно натренировать переход: человеческая мысль → логическое условие → состояние программы → код. Когда этот мост появляется, и if, и while внезапно становятся гораздо менее пугающими.
Я собираю такие практические разборы по обучению программированию, математике и разработке образовательных инструментов в Telegram-канале «Максим | Учёба, AI и разработка». Контакт: @maksim_ovi









