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

Условный оператор

Эта глава — подробное введение в ветвления на Python. Мы разберёмся, зачем они нужны, что такое логические значения, как писать условия, какие бывают варианты if, elif, else, как объединять несколько проверок и не запутаться в отступах. Материал рассчитан на читателя, который ранее не писал код вовсе.

1. Зачем вообще нужны условия?

В обычной жизни мы постоянно выбираем действия в зависимости от обстоятельств:

  • Если на улице идёт дождь — берём зонт.
  • Если урок начался — садимся за парту, иначе продолжаем отдыхать.

Программа делает то же самое. Она получает входные данные и принимает решения: «Если возраст меньше 7 — дать скидку 50 %, иначе держать полную цену». Такой выбор и называется ветвлением — выполнение может пойти по одной из веток.

2. Логические значения (тип bool)

Условия работают с логическими значениями True (истина) и False (ложь). Их можно получить несколькими способами:

print(5 > 2)        # True, потому что пять больше двух
print(10 == 3) # False, числа не равны
print(bool(1)) # True, любое ненулевое число считается истинным
print(bool(0)) # False, ноль — это ложь
print(bool('hi')) # True, непустая строка
print(bool('')) # False, пустая строка

Важно: Python автоматически превращает многие значения в True или False. Это называют «приведением к логическому типу». Полезно помнить, что пустые коллекции ([], {}, ()), пустые строки и число 0 — ложь, всё остальное — истина.

3. Общий вид конструкции if

if <условие>:
<действие, если условие истинно>
  • Ключевое слово if переводится как «если».
  • После условия обязательно ставится двоеточие :.
  • Следующая строка должна начинаться с отступа — обычно четыре пробела. Отступ показывает, что строка принадлежит блоку if.
  • Если условие ложно, блок пропускается.

Минимальный пример:

x = 10
if x > 5:
print('x больше 5')

4. Формы ветвления

4.1. if без альтернативы

Код выполняется только когда условие истинно:

temperature = int(input('Сколько градусов за окном? '))
if temperature < 0:
print('Холодно, надевай шапку')

Если температура ≥ 0, программа молча продолжит работу.

4.2. if + else

else выполняется, когда условие в if оказалось ложным.

n = int(input('Введите число: '))
if n % 2 == 0:
print('чётное')
else:
print('нечётное')

4.3. if + elif + else

elif читается как «иначе если». Python проверяет условия сверху вниз и выполняет только первую подходящую ветку. Когда условие оказалось истинным, остальные elif и else уже не просматриваются.

score = int(input('Введите балл за контрольную: '))
if score >= 90:
print('Отлично')
elif score >= 70:
print('Хорошо')
elif score >= 50:
print('Удовлетворительно')
else:
print('Нужно подтянуться')

5. Отступы и блоки кода

Отступы — ключевая особенность Python. То, что находится под одинаковым отступом, считается единым блоком.

if condition:
do_one()
do_two()
print('Этот текст печатается всегда')

В примере функции do_one() и do_two() вызовутся только если условие истинно. А print выполнится всегда, потому что его отступ вернулся к нулю.

Ошибка новичка — использовать табуляцию и пробелы вперемешку. Выберите один вариант (рекомендуется 4 пробела) и придерживайтесь его.

6. Составные условия и логические операторы

Часто нужно проверять несколько фактов одновременно. Для этого используются операторы:

  • and — «и». Условие истинно, если истинны обе части.
  • or — «или». Истинно, если хотя бы одна часть — истина.
  • not — «не». Меняет True на False и наоборот.
age = 25
has_ticket = True
if age >= 18 and has_ticket:
print('Можно входить на мероприятие')

Также полезны операторы сравнения: ==, !=, >, <, >=, <=. Их можно цепочкой:

if 7 <= age <= 17:
print('школьник')

7. Что происходит, если условие ложно?

Если условие не выполняется и нет else, Python просто перескакивает через блок. Иногда это поведение удобно. Например, можно пропустить сомнительные данные и ничего не делать:

if user_input:
process(user_input)

Здесь пустая строка ('') или 0 приведут к пропуску обработки.

8. Вложенные условия

Условия можно вкладывать друг в друга. Главное — следить за отступами.

age = int(input())
if age >= 18:
if age < 65:
print('Работоспособный возраст')
else:
print('Пенсионер')
else:
print('Несовершеннолетний')

Иногда вложенность можно заменить составным условием: if 18 <= age < 65:. Старайтесь выбирать вариант, который легче прочитать.

9. Типичные ошибки и нюансы

  • Пропущенное двоеточие: if x > 0 без : в конце вызывает синтаксическую ошибку.
  • Неправильные отступы: лишний или недостаточный отступ ломает структуру программы.
  • Сравнение с =: оператор = выполняет присваивание. Для сравнения используется ==.
  • Ввод строк вместо чисел: input() возвращает строку. Если нужно число — оборачивайте в int() или float().
  • Бесконечные цепочки elif: когда веток становится слишком много, подумайте о другой структуре (словарь, таблица соответствий, функции).

10. Примеры из практических задач

Ниже три подробных сценария, заимствованных из файлов task1.py, task2.py и task3.py. Они показывают, как комбинировать условия в реальных программах.

10.1. Билет в кино — несколько последовательных проверок

Задача: рассчитать цену билета исходя из возраста, дня недели и номера зала.

  1. Сначала проверяем входные данные. Если возраст ≤ 0, день вне диапазона 1…7 или зал не 1/2 — сразу выводим 0 и прекращаем работу.
  2. Если всё корректно, задаём price = 300.
  3. Применяем одну из возрастных скидок при помощи цепочки if / elif / elif.
  4. Дополнительный if проверяет воскресную акцию для второго зала.
age, day, hall = map(int, input().split())

if age <= 0 or day <= 0 or day > 7 or hall not in (1, 2):
print(0)
else:
price = 300

if age < 7:
price *= 0.5
elif 7 <= age <= 17:
price *= 0.7
elif age >= 60:
price *= 0.6

if hall == 2 and day == 7:
price *= 0.8

print(int(price))

Используем оператор in, чтобы компактно проверить номер зала, и and, чтобы убедиться в двух условиях одновременно.

10.2. Кредитная заявка — многоступенчатый фильтр

Задача: решить, одобрит ли банк кредит, и на какой срок.

  1. Отбрасываем некорректные числа <= 0.
  2. Проверяем возрастной диапазон. Здесь удобно использовать диапазон 18 <= age <= 65 и отрицание not (...).
  3. Смотрим на доход и вычисляем максимальную сумму (salary * 5 или salary * 10).
  4. Если клиент просит больше этого лимита, пишем «Отказ».
  5. Иначе выбираем срок кредита с помощью цепочки elif.
age, salary, credit_sum = map(int, input().split())

if age <= 0 or salary <= 0 or credit_sum <= 0:
print(0)
elif not (18 <= age <= 65):
print("Отказ")
else:
if salary < 20000:
print("Отказ")
else:
if salary <= 50000:
max_credit = salary * 5
else:
max_credit = salary * 10

if credit_sum > max_credit:
print("Отказ")
elif credit_sum <= 100000:
print(1)
elif credit_sum <= 500000:
print(3)
else:
print(5)

Этот пример показывает, что условия можно располагать слоями. Главное — формулировать каждую проверку так, чтобы она отвечала на один конкретный вопрос.

10.3. Проверка даты и квартала — комбинируем несколько веток

Задача: определить, существует ли введённая дата, и вывести квартал (1…4), если дата корректна.

  1. Проверяем диапазоны дня и месяца.
  2. Для месяцев с 31 и 30 днями используем кортежи и оператор in.
  3. Для февраля считаем високосность и выбираем максимально допустимый день.
  4. Если дата подтверждена, второй блок if / elif / else печатает квартал.
day, month, year = map(int, input().split())

is_correct = False

if 1 <= month <= 12 and 1 <= day <= 31:
if month in (1, 3, 5, 7, 8, 10, 12) and day <= 31:
is_correct = True
elif month in (4, 6, 9, 11) and day <= 30:
is_correct = True
elif month == 2:
leap = (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)
max_day = 29 if leap else 28
if day <= max_day:
is_correct = True

if is_correct:
if month <= 3:
print(1)
elif month <= 6:
print(2)
elif month <= 9:
print(3)
else:
print(4)
else:
print("Дата некорректна")
else:
print("Дата некорректна")

Обратите внимание, что блок с выводом «Дата некорректна» появляется в двух местах. Это нормальная практика: условия могут возвращать пользователя назад, если что-то пошло не так.

11. Дополнительные упражнения

  1. Пользователь вводит число. Выведите «positive», «negative» или «zero» в зависимости от значения.
  2. Введите возраст и стаж. Если возраст ≥ 18 и стаж ≥ 1 год — печатайте «допущен к работе», иначе «нужна стажировка».
  3. Введите три числа, найдите максимум без функции max(), используя только if и elif.

Попробуйте проговаривать свои условия вслух, прежде чем писать код. Это помогает убедиться, что логика понятна.

12. Краткий чек-лист перед запуском программы

  • Все if, elif, else заканчиваются двоеточием.
  • Внутри каждого блока одинаковый отступ (4 пробела).
  • Используются логические операторы and/or, где это облегчает чтение.
  • Проверены крайние случаи (минимум, максимум, ноль, пустые значения).
  • Внятный вывод для пользователя: программа объясняет, что произошло.

Освоив условные операторы, вы сможете создавать программы, которые реагируют на ввод пользователя и меняют своё поведение в зависимости от ситуации. Это фундаментальное умение, без которого не обойтись в любом языке программирования.