Глиф Учебники

Урок 4. Условия: if, elif, else

Курс «Python» · урок 4 из 10 · 4 минуты чтения

До сих пор программы выполняли все строки подряд. Но часто нужно поступить по-разному в зависимости от данных: число чётное или нет, пароль верный или нет. Для этого есть условия — команда if и её продолжения elif и else.

Сравнения

Условие — это выражение, которое даёт True (истина) или False (ложь). Чаще всего его получают сравнением:

ЗнакЗначениеПримерРезультат
==равно5 == 5True
!=не равно5 != 3True
<меньше5 < 3False
>больше5 > 3True
<=меньше или равно5 <= 5True
>=больше или равно3 >= 5False

Равенство проверяют двумя знаками ==. Один знак = — это присваивание, его в условии писать нельзя.

Python
x = 7
print(x > 5)
print(x == 10)
print(x != 10)
print(1 < x < 10)
Вывод
True
False
True
True

Последняя строка — двойное сравнение, как в математике: 1 < x < 10 значит «x больше 1 и меньше 10».

Команда if

Python
age = int(input())
if age >= 18:
    print("Совершеннолетний")
print("Проверка окончена")
Ввод
20
Вывод
Совершеннолетний
Проверка окончена

Как это устроено:

Если ввести 15, программа выведет только «Проверка окончена».

ввод 20 ввод 15 age = int(input()) if age >= 18: ← двоеточие print("Совершеннолетний") ← отступ: блок if print("Проверка окончена") ← без отступа: вне if True False пропуск
Строка с отступом под if age >= 18 — это блок if: при вводе 20 условие True и блок выполняется, при вводе 15 условие False и блок пропускается, а строка без отступа выполняется всегда.

Отступ в Python — не украшение, а часть языка: им отмечают блок — группу команд, которые выполняются вместе. В Pascal для этого пишут begin и end, в Python — сдвигают строки. Редакторы ставят отступ сами после строки с двоеточием. Если отступы сбились, Python сообщит об ошибке IndentationError — как её исправить, рассказано в справке IndentationError: ошибка отступа.

if и else

else («иначе») — блок, который выполняется, когда условие ложно:

Python
n = int(input())
if n % 2 == 0:
    print("чётное")
else:
    print("нечётное")
Ввод
7
Вывод
нечётное

Остаток от деления на 2 у чётного числа равен нулю — это самая частая проверка в школьных задачах.

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

Когда вариантов больше двух, между if и else ставят одну или несколько веток elif («иначе если»):

Python
age = int(input())
if age < 7:
    print("Бесплатно")
elif age < 18:
    print("Детский билет")
elif age < 65:
    print("Взрослый билет")
else:
    print("Льготный билет")
Ввод
12
Вывод
Детский билет

Условия проверяются сверху вниз, и выполняется только первая ветка с истинным условием. Возраст 12 меньше 18 — выполняется вторая ветка, а условие age < 65 уже не проверяется, хотя оно тоже истинно. Поэтому порядок веток важен: если поставить age < 65 первым, детского билета не получит никто. Ветка else в конце необязательна.

age = 12 age < 7 False нет age < 18 True да Детский билет да Бесплатно нет age < 65 не проверяется нет да Взрослый билет else всё остальное Льготный билет
При age = 12 условие age < 7 ложно, а age < 18 истинно — выполняется ветка «Детский билет», и остальные условия уже не проверяются.

Логические операторы: and, or, not

ОператорЗначениеИстинно, когда
andиистинны оба условия
orилиистинно хотя бы одно
notнеусловие ложно

Пример — проверка високосного года. Год високосный, если делится на 4, но не делится на 100, или если делится на 400:

Python
year = int(input())
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    print("високосный")
else:
    print("невисокосный")
Ввод
2024
Вывод
високосный

По этому правилу 2000 год високосный, а 1900 — нет. Без скобок Python выполнил бы and раньше or и получил бы тот же результат, но скобки делают условие понятнее для человека.

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

Внутри блока if может стоять ещё одно условие — с ещё большим отступом:

Python
login = "admin"
password = "12345"
if login == "admin":
    if password == "qwerty":
        print("Добро пожаловать")
    else:
        print("Неверный пароль")
else:
    print("Нет такого пользователя")
Вывод
Неверный пароль

Глубоко вложенные условия читать трудно. Часто их можно заменить одним условием с and или веткой elif.

Что считается истиной

В if можно поставить не только сравнение. Число 0, пустая строка "" и пустой список [] считаются ложью, всё остальное — истиной:

Python
name = ""
if name:
    print("Имя есть")
else:
    print("Имя не введено")
Вывод
Имя не введено

Частые ошибки

Запись answer == "да" or "yes" значит не «ответ — да или yes», а «ответ — да, или строка "yes"». Непустая строка всегда истинна, поэтому всё условие истинно при любом ответе:

Python
answer = "нет"
if answer == "да" or "yes":
    print("Условие выполнилось")
if answer == "да" or answer == "yes":
    print("Это не выведется")
if answer in ("да", "yes"):
    print("И это не выведется")
Вывод
Условие выполнилось

Правильно — повторить сравнение для каждого варианта или проверить, входит ли ответ в набор вариантов, через in.

answer = "нет" неверно if answer == "да" or "yes": False or "yes" непустая строка — истина истина при любом ответе верно if answer == "да" or answer == "yes": False or False ложь как и нужно
Python делит answer == "да" or "yes" на сравнение и отдельную строку "yes", а непустая строка истинна — условие верно при любом ответе; правильно — answer == "да" or answer == "yes".

Коротко

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

1. Что выведет программа?
Python
x = 15
if x > 10:
    print("A")
elif x > 5:
    print("B")
else:
    print("C")
2. Как правильно проверить, что n равно нулю?
3. Какое условие истинно, только если x от 1 до 10 включительно?
4. Почему условие answer == "да" or "yes" истинно при любом ответе?