Глава 9 · Выполняй мою команду!

Проектируем условие: ввод, валидация, границы

Повторяемый способ подходить к любому условию — от требования до протестированного граничного значения.

Валидация — это не то же самое, что решение

Прежде чем принимать решение по введённым данным, нужно проверить, что данные вообще осмысленны. Это два разных шага:

validaciya_i_reshenie.py
age_text = input("Возраст: ").strip()

if age_text.isdigit():          # 1. валидация
    age = int(age_text)
    if age >= 18:                # 2. решение
        print("Доступ разрешён")
    else:
        print("Доступ запрещён")
else:
    print("Это не похоже на число")
Полноценная обработка ошибок — впереди
Здесь мы проверяем ввод вручную через isdigit() (глава 8). Настоящий механизм обработки исключений — try/except — придёт в отдельной главе позже; пока достаточно этого простого подхода.

Границы — источник большинства ошибок

«Разрешены значения от 1 до 10 включительно» — как записать это правильно?

granicy.py
number = 1
print(1 <= number <= 10)   # True — правильно, включает края
print(1 < number < 10)     # False — ЛОВУШКА: отвергает 1 и 10!
Значение1 &lt;= number &lt;= 10Комментарий
0Falseниже границы
1Trueровно на границе — входит
10Trueровно на границе — входит
11Falseвыше границы
Off-by-one — классическая ошибка
Если формулировка говорит «включительно», а в коде стоит строгое </> вместо <=/>=, граничные значения незаметно отбрасываются. Такую ошибку называют off-by-one («ошибка на единицу») — она встречается настолько часто, что заслуживает отдельного имени.

Повторяемый способ проектировать условие

ТРЕБОВАНИЕчто нужно проверитьВОПРОСсформулировать явноУСЛОВИЕперевести в PythonВЕТКИчто делать приTrue/FalseГРАНИЦЫпротестировать край
Повторяемый workflow проектирования условия — от требования до протестированного кода

Перед тем как писать код:

  1. Какой вопрос мы задаём?
  2. Какие значения в нём участвуют?
  3. Что означает результат True?
  4. Что делать, если True? А если False?
  5. Есть ли больше двух исходов?
  6. Какие здесь граничные значения?

Всегда тестируйте значение чуть ниже границы, ровно на границе, и чуть выше — это простое правило ловит огромную долю логических ошибок ещё до того, как они попадут к пользователю.

★★ Самостоятельная задача
Спроектируйте сами

Требование: «Скидка положена при сумме покупки от 1000 рублей». Пройдите весь workflow — от вопроса до протестированного кода — и проверьте граничные значения 999, 1000, 1001.

Практика: валидация, границы и off-by-one
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →