Пока что ваши программы выполнялись как список покупок: сверху вниз, строка за строкой, без права выбора. Но настоящие программы постоянно принимают решения. Сайт решает, показать вам кнопку «Войти» или ваше имя. Банкомат решает, выдать деньги или написать «Недостаточно средств». Игра решает, засчитать выстрел или нет.
В прошлом уроке вы научились задавать вопросы: сравнивать числа и строки, получать в ответ True или False. Теперь научимся реагировать на эти ответы — заставим программу делать разные вещи в зависимости от результата сравнения.
Условие: код, который выполняется по желанию
Простыми словами: обычно программа выполняет каждую строку без разбора. Но иногда нужен кусок кода, который сработает только при определённых обстоятельствах — как охранник, который пускает в клуб только тех, кто прошёл фейс-контроль. Остальные строки идут мимо этого куска, будто его и не было.
Официально этот механизм называется условный оператор if (от английского «если»). Он проверяет выражение, о котором вы узнали в прошлом уроке — то, что даёт True или False — и если получилось True, выполняет код, который к нему привязан. Если получилось False — пропускает его.
age = 20
if age >= 18:
print("Доступ разрешён")
Разбираем построчно:
age = 20 — обычное присваивание, вы это уже умеете. Переменной age кладём число 20.If Python не поймёт.age >= 18 — само условие. Здесь сравнивается значение age с числом 18, результат — True (20 действительно не меньше 18) или False.print("Доступ разрешён") — собственно тот самый код «по желанию». Он сдвинут вправо на 4 пробела — и это не случайность, а следующая тема.Так как age = 20, условие age >= 18 даёт True, и программа выведет Доступ разрешён. Если бы age было равно, скажем, 15 — строка с print вообще не выполнилась бы, и программа просто ничего не вывела бы.
Отступы: как Python понимает, где заканчивается условие
Простыми словами: если код, привязанный к условию, состоит из нескольких строк, нужно как-то показать, где эта группа строк заканчивается. В других языках для этого расставляют фигурные скобки. В Python вместо скобок используют сдвиг вправо — будто абзац с отступом в тексте.
Официально такая группа строк называется блоком кода, а сам сдвиг — отступом (indentation). Стандарт языка (документ PEP 8) требует ровно 4 пробела на один уровень отступа. Все строки одного блока должны иметь одинаковый отступ — иначе Python не поймёт, где блок начинается и заканчивается.
age = 20
if age >= 18:
print("Доступ разрешён")
print("Приятного просмотра")
print("Программа завершена")
Здесь две строки с отступом — это один блок, они выполнятся вместе, если условие истинно. А третий print отступа не имеет, значит он вне условия и выполнится всегда — и при True, и при False.
print("Доступ разрешён") написать без сдвига — Python сообщит IndentationError: expected an indented block. Дословно: «я ждал блок с отступом, но не нашёл его».else: что делать, если условие не выполнилось
Простыми словами: одного if хватает, чтобы описать «что делать, если да». Но часто нужен и запасной план на случай «если нет». Как турникет в метро: если карта сработала — проход открыт, если нет — загорается красный свет. Оба исхода предусмотрены заранее.
Официально запасной блок называется else (от английского «иначе»). Он присоединяется прямо к if, у него нет собственного условия — он значит «во всех остальных случаях».
number = -7
if number > 0:
print("Число положительное")
else:
print("Число не положительное")
number > 0 — условие. При number = -7 оно даёт False: минус семь не больше нуля.else, и программа выведет Число не положительное. Строка внутри if не выполнится вовсе.Важное отличие от одиночного if из предыдущего раздела: конструкция if...else покрывает оба исхода целиком. Один из двух блоков выполнится обязательно, третьего варианта нет.
Не только True и False: любое значение можно проверить
Простыми словами: в условии необязательно писать сравнение вроде age >= 18. Python умеет сам решать, считать значение «пустым» (и тогда вести себя как False) или «непустым» (как True). Похоже на вопрос «у вас есть что сказать?» — если ответ пустой, это как отказ.
Официально это называется truthy и falsy значения. Falsy — то, что Python автоматически превращает в False: число 0, пустая строка "", пустой список, пустой словарь и особое значение None (о нём поговорим позже). Всё остальное — truthy, то есть ведёт себя как True.
name = input("Введите ваше имя: ")
if name:
print("Привет,", name)
else:
print("Вы не ввели имя")
name = input(...) — вы уже знаете: результат input() всегда строка, здесь она попадает в переменную name.if name: — в условии стоит просто переменная, без всякого сравнения. Python сам проверит: пустая строка — falsy, любая непустая — truthy.Привет, Мария. Если просто нажал Enter, ничего не введя — строка пустая, условие falsy, сработает else.if name: вместо if name != "": — хороший тон в Python. Код становится короче и читается как обычная фраза: «если имя есть».Условие внутри условия
Простыми словами: иногда одной развилки мало — после первого выбора нужен ещё один. Например, сначала проверить возраст, а если он подошёл — ещё и наличие билета. Это как двойная дверь: сначала одна проверка, потом, если она пройдена, следующая.
Официально такое условие внутри блока другого условия называется вложенным if (nesting). Правило то же самое: каждый новый уровень — ещё 4 пробела отступа сверх предыдущего.
age = 20
has_ticket = True
if age >= 18:
if has_ticket:
print("Проходите")
else:
print("Нет билета")
else:
print("Вам нет 18")
Внешний if/else стоит на нулевом уровне отступа. Внутренний if/else сдвинут на 4 пробела — он выполнится, только если внешнее условие оказалось истинным. Блоки внутреннего условия сдвинуты ещё на 4 пробела, то есть на 8 от начала строки. При age = 20 и has_ticket = True сработают обе внешних и внутренних проверки, и программа выведет Проходите.
elif, которая во многих случаях заменяет вложенные if и делает код короче.Частые ошибки
Забытое двоеточие
if age >= 18
print("Доступ разрешён")
Разные отступы в одном блоке
if age >= 18:
print("Первая строка")
print("Вторая строка")
Одиночный = вместо == внутри условия
if age = 18:
print("Ровно 18")
= означает присваивание, а не сравнение. Внутри условия для сравнения нужен именно ==, который вы разбирали в прошлом уроке.Что важно запомнить
if и после else всегда ставится двоеточие, а следующий блок кода сдвигается на 4 пробела.if/else выполнится ровно один блок.None — falsy, всё остальное — truthy.if можно писать ещё один if — вложенность, где каждый уровень добавляет ещё 4 пробела.==, а не =: одиночный знак равенства — это присваивание.Проверьте себя
4 вопроса
Проверка возраста
Дана переменная age = 20. Используйте if-else, чтобы присвоить переменной status:
"Совершеннолетний", еслиage >= 18"Несовершеннолетний"иначе
Выведите status на экран.
Положительное или отрицательное
Дана переменная number = -7. Используйте if-else, чтобы присвоить переменной result:
"Положительное", еслиnumber > 0"Не положительное"иначе
Выведите result на экран.
Безопасное деление
Даны переменные a = 100 и b = 0. Напишите программу, которая делит a на b и выводит результат — но только если b не равен нулю. Если b равен нулю, вместо деления выведите ровно текст: Деление на ноль невозможно.
Большее из двух чисел
Даны переменные a = 15 и b = 42. Без использования готовой функции max() определите, какое из чисел больше, и запишите его в переменную bigger. Если числа равны — запишите в bigger любое из них.
Выведите bigger на экран.