Условный оператор if-else
Мы познакомились с базовыми строительными блоками программ, научились писать программы, обеспечивающие ввод, обработку и вывод данных. Более того, мы умеем работать со строками и числами, как мы делаем это в математике. Теперь научимся управлять ходом выполнения программы.
Программы должны уметь выполнять разные действия в зависимости от введенных данных. Для принятия решения программа проверяет, истинно или ложно определенное условие.
В Python существует несколько способов проверки, и в каждом случае возможны два исхода: истина (True
) или ложь (False
).
Проверка условий и принятие решений по результатам этой проверки называется ветвлением (branching). Программа таким способом выбирает, по какой из возможных ветвей ей двигаться дальше.
В Python проверка условия осуществляется при помощи ключевого слова if
.
Рассмотрим следующую программу:
answer = input('Какой язык программирования мы изучаем?')
if answer == 'Python':
print('Верно! Мы ботаем Python =)')
print('Python - отличный язык!')
Программа просит пользователя ввести текст и проверяет результат ввода. Если введенный текст равен строке «Python», то выводит пользователю текст:
Верно! Мы ботаем Python =)
Python - отличный язык!
Двоеточие (:
) в конце строки с инструкцией if
сообщает интерпретатору Python, что дальше находится блок команд. В блок команд входят все строки с отступом под строкой с инструкцией if
, вплоть до следующей строки без отступа.
Если условие истинно, выполняется весь расположенный ниже блок. В предыдущем примере блок инструкций составляет третья и четвертая строки программы.
Блоком кода называют объединенные друг с другом строки. Они всегда связаны с определенной частью программы (например, с инструкцией if
). В Python блоки кода формируются при помощи отступов.
Предыдущая программа выводит текст в случае, если условие истинно. Но если условие ложно, то программа ничего не выводит. Для того чтобы обеспечить возможность выполнять что-либо в случае, если условие оказалось ложным, мы используем ключевое слово else
.
answer = input('Какой язык программирования мы изучаем?')
if answer == 'Python':
print('Верно! Мы ботаем Python =)')
print('Python - отличный язык!')
else:
print('Не совсем так!')
В новой программе мы обрабатываем сразу два случая: если условие истинно (пользователь ввел «Python»), и если условие ложно (пользователь ввел что угодно, кроме «Python»).
Отступы
В некоторых языках программирования отступы — дело личного вкуса, и можно вообще обходиться без них. Однако в Python они – неотъемлемая часть кода. Именно отступ сообщает интерпретатору Python, где начинается и где заканчивается блок кода.
Отступ — небольшое смещение строки кода вправо. В начале такой строки находятся пробелы, и поэтому она на несколько символов отстоит от левого края.
Некоторым инструкциям в Python (например, инструкции if
) именно блок кода сообщает, какие действия следует предпринять. После if
блок кода информирует интерпретатор Python, как действовать, если условие истинно, и как — если оно ложно.
По соглашению PEP 8, для отступа блоков кода используются 4 пробела. Если в среде VS Code или Wing IDE нажать на клавишу Enter после if
, она автоматически выставит 4 пробела.
Операторы сравнения
Можно заметить, что в проверке условия мы использовали двойное равенство (==
), вместо ожидаемого одиночного (=
). Не стоит путать оператор присваивания (=
) с условным оператором (==
).
Оператор присваивания (=
) присваивает переменным значения:
num = 1992
s = 'I love Python'
Для проверки двух элементов на равенство Python использует удвоенный знак равно (==
). Вот так:
if answer == 'Python':
...
if name == 'Gvido':
...
if temperature == 40:
...
Путаница с операторами ==
и =
является одной из самых распространенных ошибок в программировании. Эти символы используются не только в Python, и каждый день множество программистов используют их неправильно.
В Python существует 6 основных операторов сравнения.
Выражение |
Описание |
if x > 7 |
если x больше 7 |
if x < 7 |
если x меньше 7 |
if x >= 7 |
если x больше либо равен 7 |
if x <= 7 |
если x меньше либо равен 7 |
if x == 7 |
если x равен 7 |
if x != 7 |
если x не равен 7 |
Рассмотрим пример:
num1 = int(input())
num2 = int(input())
if num1 < num2:
print(num1, 'меньше чем', num2)
if num1 > num2:
print(num1, 'больше чем', num2)
if num1 == num2:
print(num1, 'равно', num2)
if num1 != num2:
print(num1, 'не равно', num2)
Цепочки сравнений
Операторы сравнения в Python можно объединять в цепочки (в отличие от большинства других языков программирования, где для этого нужно использовать логические связки), например, a == b == c
или 1 <= x <= 10
. Следующий код проверяет, находится ли значение переменной age
в диапазоне от 3 до 6:
age = int(input())
if 3 <= age <= 6:
print('Вы ребёнок')
Код, проверяющий равенство трех переменных, может выглядеть так:
if a == b == c:
print('числа равны')
else:
print('числа не равны')
Транзитивность
Операция равенства является транзитивной. Это означает, что если a == b
и b == c
, то из этого следует, что a == c
. Именно поэтому предыдущий код, проверяющий равенство трех переменных, работает, как полагается.
Из курса математики вам могут быть знакомы другие примеры транзитивных операций:
- Отношение порядка: если a>b и b>c, то a>c;
- Параллельность прямых: если a?b и b ?c, то a?c;
- Делимость: если a делится на b и b делится на c, то a делится на c.
Наглядно транзитивность отношения порядка можно понять на таком примере: если сосед слева старше вас (a>b), а вы старше соседа справа (b>c), то сосед слева точно старше соседа справа (a>c).
Операция неравенства (!=
), в отличие от операции равенства (==
), является нетранзитивной. То есть из того, что a != b
и b != c
вовсе не следует, что a != c
. Действительно, если вас зовут не так, как соседа слева и не так, как соседа справа, то нет гарантии, что у обоих соседей не окажутся одинаковые имена.
Таким образом, следующий код вовсе не проверяет тот факт, что все три переменные различны:
if a != b != c:
print('числа не равны')
else:
print('числа равны')
Код, проверяющий, что значения трех переменных различны, мы научимся писать немного позже.