Перейти к основному содержимому

Условия

Робот выбирает действие по результату проверки условия

Программа робота редко выполняет одну и ту же команду при любых обстоятельствах. Если путь свободен, робот может продолжить движение. Если датчик обнаружил препятствие, нужно остановиться или повернуть. Такой выбор в Python записывают с помощью if, elif и else.

Коротко

Условие — это выражение, которое программа считает истинным или ложным. Блок после if выполняется при истинном условии. elif проверяет следующий вариант, а else задаёт действие на случай, когда предыдущие проверки не сработали.

Зачем это нужно

Условия связывают данные с поведением устройства. Они нужны, когда программа должна:

  • остановить моторы перед препятствием;
  • включить индикатор при низком заряде;
  • выбрать направление по двум датчикам линии;
  • принять команду только после нажатия кнопки;
  • отбросить явно ошибочное измерение.

Условная конструкция не исправляет неточный датчик и не заменяет аппаратную защиту. Она задаёт понятное правило: какие входные значения приводят к какому действию. Такое правило можно проверить на обычном компьютере до подключения моторов.

Главная идея

Python выполняет программу сверху вниз. Встретив if, интерпретатор вычисляет выражение после этого слова. Если результат равен True, выполняется блок с отступом. Если результат равен False, этот блок пропускается.

Блок-схема простого условия if

distance_cm = 18

if distance_cm < 20:
print("Стоп: препятствие близко")

В выражении distance_cm < 20 оператор < сравнивает два числа и возвращает логическое значение. При distance_cm = 18 сравнение истинно, поэтому программа печатает сообщение.

Двоеточие завершает заголовок ветви, а одинаковый отступ объединяет команды в её блок. Обычно используют четыре пробела. Фигурные скобки для блока в Python не нужны.

Отступ — часть синтаксиса

Команда без нужного отступа уже не принадлежит ветви. Смешивание табуляции и пробелов также может привести к ошибке или запутать структуру кода.

Отступы вместо фигурных скобок

В C++ границы блока показывают фигурные скобки. В Python границы блока показывает одинаковый отступ. Поэтому Python-код выглядит короче, но требует аккуратности с пробелами.

Сравнение блоков условия в Python и C++

Одинаковый смысл на C++:

if (distance_cm < 20) {
cout << "stop" << endl;
cout << "obstacle" << endl;
}

cout << "check done" << endl;

И на Python:

if distance_cm < 20:
print("stop")
print("obstacle")

print("check done")

Две строки с четырьмя пробелами относятся к условию. Последняя строка начинается без отступа, поэтому выполняется после проверки в любом случае.

Сравнения, из которых строятся условия

Чаще всего условие сравнивает измерение с порогом, режим — с ожидаемым значением, а два сигнала — друг с другом.

ОператорКак читатьПример
==равноmode == "auto"
!=не равноsensor_status != "ok"
<меньшеdistance_cm < 20
<=меньше или равноbattery_percent <= 15
>большеtemperature_c > 60
>=больше или равноsamples_count >= 5

Оператор == проверяет равенство, а одиночный = присваивает значение переменной. Поэтому запись mode = "auto" подходит для настройки режима, но не для условия внутри if.

Границу следует формулировать точно. Условия distance_cm < 20 и distance_cm <= 20 по-разному обрабатывают значение 20. Для датчика полезно заранее выписать несколько точек около порога и определить ожидаемую ветвь для каждой.

На этом этапе можно проверить границу тремя отдельными значениями:

stop_distance_cm = 20

distance_cm = 19
print(distance_cm < stop_distance_cm)

distance_cm = 20
print(distance_cm < stop_distance_cm)

distance_cm = 21
print(distance_cm < stop_distance_cm)

Позже мы заменим такие повторяющиеся строки циклом. Пока важно увидеть, как меняется результат сравнения около порога.

Два варианта: if и else

Если нужно выбрать одно из двух действий, к if добавляют else:

distance_cm = 35

if distance_cm < 20:
print("Моторы остановлены")
else:
print("Движение разрешено")

В этой конструкции выполняется ровно одна ветвь. У else нет собственного условия: она используется, только если выражение после if оказалось ложным.

Не всякая задача требует else. Например, индикатор можно включить только при обнаружении ошибки, а затем продолжить выполнение общей части программы:

sensor_ok = False

if not sensor_ok:
print("Нет достоверного измерения")

print("Проверка завершена")

Последняя команда расположена без отступа, поэтому выполняется независимо от результата проверки.

Несколько вариантов: if, elif, else

Для трёх и более взаимоисключающих режимов используют цепочку elif. Python проверяет условия сверху вниз и выполняет блок первой истинной ветви. Остальные условия этой цепочки уже не вычисляются.

distance_cm = 37

if distance_cm < 15:
speed = 0
elif distance_cm < 40:
speed = 30
else:
speed = 70

print("Команда скорости:", speed)

Значение 10 удовлетворяет и условию < 15, и условию < 40, но будет выбрана первая ветвь. Поэтому более узкую и приоритетную проверку ставят раньше.

РасстояниеПервая истинная проверкаКоманда speed
меньше 15 смdistance_cm < 150
от 15 до 39 смdistance_cm < 4030
40 см и большени одна70

Последовательная проверка условий направляет сигнал к одному выходу

Цепочка ifelifelse выбирает один вариант. Несколько отдельных конструкций if работают иначе: истинными могут оказаться сразу несколько проверок, и тогда выполнятся несколько блоков.

distance_cm = 12
battery_percent = 9

if distance_cm < 20:
print("Остановиться перед препятствием")

if battery_percent < 15:
print("Запросить зарядку")

Здесь обе реакции нужны одновременно, поэтому отдельные if подходят лучше одной цепочки.

Логические операции

Одно решение часто зависит от нескольких признаков. Python соединяет их словами and, or и not.

ОперацияКогда результат истиненРобототехническое правило
a and bистинны обе частистарт нажат и путь свободен
a or bистинна хотя бы одна частьпрепятствие слева или справа
not aa ложноехать, если аварийная остановка не активна
start_pressed = True
distance_cm = 42
emergency_stop = False

can_move = (
start_pressed
and distance_cm >= 20
and not emergency_stop
)

if can_move:
print("Запуск моторов разрешён")
else:
print("Моторы остаются выключенными")

Круглые скобки позволяют перенести длинное выражение на несколько строк и показывают, какие части образуют одно правило.

У and и or действует сокращённое вычисление. В a and b правая часть не вычисляется, если a уже ложно. В a or b она не вычисляется, если a истинно. Это удобно, когда вторая проверка допустима только после первой:

distance_cm = None

if distance_cm is not None and distance_cm < 20:
print("Близкое препятствие")
else:
print("Нет опасного измерения")

Сначала программа убеждается, что измерение вообще есть. Только затем она сравнивает число с порогом. Переставлять части в таком условии нельзя: None < 20 не является корректным сравнением.

Истинные и ложные значения

В if можно передать не только результат сравнения. Python умеет проверять логическое значение многих объектов. Числовой ноль, пустая строка и пустая коллекция считаются ложными; непустые строки и коллекции обычно считаются истинными.

message = ""

if message:
print("Сообщение есть")
else:
print("Сообщение пустое")

Такую краткую запись удобно читать, когда смысл действительно звучит как «строка не пустая». Для начинающего кода явное сравнение иногда яснее. Например, distance_cm is not None точнее сообщает, что None обозначает отсутствие измерения, а ноль может быть отдельным допустимым или аварийным показанием.

None — не нулевое расстояние

Если функция возвращает None при отсутствии данных, сначала проверьте это состояние. Не подменяйте его числом 0, пока не определено, что ноль означает для конкретного датчика.

Робототехнический пример: безопасный выбор скорости

Соберём проверки в порядке приоритета. Сначала учитывается аварийная остановка, затем достоверность измерения, затем расстояние:

emergency_stop = False
distance_cm = 18

if emergency_stop:
command = "stop: emergency"
elif distance_cm is None:
command = "stop: no data"
elif distance_cm < 20:
command = "stop: obstacle"
elif distance_cm < 45:
command = "slow"
else:
command = "forward"

print(command)

Такая программа остаётся учебной моделью: строка с командой не управляет настоящим приводом. Зато таблицу входов можно составить и проверить без оборудования.

emergency_stopdistance_cmОжидаемая группа действий
Trueлюбое значениеаварийная остановка
FalseNoneостановка из-за отсутствия данных
Falseменьше 20остановка перед препятствием
Falseот 20 до 44медленное движение
False45 и большеобычное движение

Что запомнить про условия

  • if проверяет первый вариант, elif — следующие, else — оставшийся случай.
  • В одной цепочке выполняется блок первой истинной ветви.
  • Отступ определяет, какие команды входят в блок.
  • == сравнивает, а = присваивает.
  • and, or и not соединяют логические признаки.
  • Граничные значения и приоритет ветвей лучше выписать до запуска робота.

Практика

Задание 1. Порог освещённости

Напишите программу с переменной light_level. Если значение меньше выбранного порога, программа должна вывести команду включения подсветки, иначе — команду выключения. Проверьте число ровно на границе порога.

Задание 2. Три диапазона расстояния

Составьте цепочку ifelifelse для команд «стоп», «медленно» и «вперёд». Самостоятельно выберите два порога и подготовьте не менее пяти тестовых расстояний, включая обе границы.

Задание 3. Разрешение запуска

Создайте логические переменные для кнопки старта, закрытого защитного кожуха и аварийной остановки. Запишите одно выражение can_start, при котором запуск разрешён. Не выводите готовую таблицу ответов — заполните её при запуске своей программы.

Задание 4. Два независимых сообщения

Пусть программа отдельно предупреждает о близком препятствии и о низком заряде. Решите, нужны ли здесь elif или два самостоятельных if, и объясните выбор в комментарии к коду.

Проверьте себя

  1. Какое значение должно получить условие, чтобы блок после if выполнился?
  2. Чем elif отличается от отдельного второго if?
  3. Почему порядок ветвей < 15 и < 40 влияет на результат?
  4. Какую роль играют двоеточие и отступ?
  5. Чем == отличается от =?
  6. Когда правая часть выражения с and не вычисляется?
  7. Почему отсутствие измерения полезно хранить как None, а не всегда как 0?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Условие — выражение, которое проверяется как истинное или ложное.
  • Ветвь — блок команд, выбранный по результату условия.
  • if — начало условной конструкции и первая проверка.
  • elif — следующая проверка в той же цепочке.
  • else — ветвь без собственного условия для всех оставшихся случаев.
  • Логическое значение — одно из двух значений: True или False.
  • Оператор сравнения — операция вроде <, >= или ==, возвращающая логический результат.
  • Сокращённое вычисление — пропуск правой части and или or, когда результат уже определён.
  • Порог — граничное значение, по которому программа разделяет режимы.

Связанные темы

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

Источники