Ветвление или условные операторы - это также базовое понятие процедурного (и не только) программирования. Оно позволяют принять решения, когда существует некоторый выбор между возможными путями продолжения алгоритма. Ветвление помогает перенаправить или изменить поведение алгоритма. Составление алгоритма сложно представить без использования условий.
Выбор между одним из возможных вариантов развития алгоритма осуществляется в python, как и во многих других языках программирования, с помощью связки условных операторов "if-else"
.
В коротком виде он выглядит так (треугольные скобки <> здесь не играют важной роли, а служат лишь для выделения выражения):
if <выражение>:
....<строка кода>
Обратите внимание, что if должно начинаться со строчной буквы, а в конце обязательно должно стоять двоеточие!
Условный оператор if проверяет на равенство истине (True) выражение, которое стоит после него до двоеточия. И в случае равенства пускает течение алгоритма "внутрь", во вложенный блок, в тело условия.
Условные операторы, как и циклы, являются конструкциями-контейнерами, т.е. для содержимого условного оператора if требуется применять правило 4 отступов-пробелов.
a = 5
b = -12.5e2
if a > b:
print(a)
Но что же будет c алгоритмом в случае, если a < b? В приведённом примере это условие явно не описано, и если a = 10, b = 15, то программа ничего не выведет на экран.
Использование только оператора if удобно для простых условий. Когда же требуется рассмотреть все возможные варианты выражения условия, то требуется дополнение в виде оператора else.
Else перехватывает управление поведением алгоритма тогда, когда описанные выше условия не были выполнены. Так для условия a > 10, ветвь оператора else соответствует случаям, когда a <= 10. Такую связку "if-else" можно заменить двумя if-ами.
В общем же виде оператор else перехватывает все варианты, которые не соответствуют условию, стоящему в if.
Обратите внимание, что else(как и if) должен начинаться со строчной буквы, а в конце обязательно должно стоять двоеточие! При этом НИКАКИХ выражений до двоеточия оператор не требует! Располагается else на одном вложенном уровне с оператором if, а для вложенного в else кода применяется правило вложенности или 4 пробелов.
Оператор else является необязательным при создании условия с помощью оператора if. Тем не менее, это очень важный оператор, который позволяет реализовать альтернативный вариант выбора, когда выражение после оператора if и до двоеточия не истинно, то есть ложно, то есть равно False в логическом смысле.
a = 5
b = -12.5e2
if a > b:
print(a)
else:
print(b - a) # для заданных a и b это условие не выполняется
# Данную связку "if-else" можно заменить двумя if-ами:
if a > b:
print(a)
if a <= b:
print(b - a) # для заданных a и b это условие не выполняется
Для более сложного условия вариант if-else намного компактнее и яснее для понимания. Так в случае проверки на истинность выражения a < x <= b истинному значению соответствует интервал, открытый с одной стороны. В этом случае else перехватит значения x, когда:
x > a
x == a
x > b
Пример: для получения кредита на сайте банка есть условие: возраст 18 лет или старше. С другой стороны, люди старше 80 лет не рассматриваются банком как надёжные клиенты, и им автоматически отказывают в кредите.
Здесь можно сначала проверить данные клиента на совершеннолетие, а затем на превышение порогового возраста. Можно наоборот, но в итоге трубется использовать оба условия.
Описывать такую задачу только с помощью if-ов громоздко и неразумно.
x = 55 # возраст клиента
LC = 18
RC = 80
if LC <= x <= RC:
#if (x >= LC) and (x <= RC):
print('Credit application accepted')
else:
print('Credit Application rejected')
Credit application accepted
В случае, когда необходимо проверить на истинность несколько взаимоисключающих выражений (скажем, определение типа ответа клиента на качество обслуживания), следует пользоваться дополнительным оператором условия - elif. Он располагается между операторами if и else и служит для введения дополнительного (помиио основного if) условия. В других языках программирования его функции выполняют такие конструкции как SWITCH(C++) и SELECT CASE(Fortran90).
Обратите внимание, что elif должно начинаться со строчной буквы, а в конце обязательно должно стоять двоеточие! В остальном он идентичен по синтаксису оператору if. Стоит помнить, что elif существует только в связке с if!
Необязательный оператор elif в конструкции условного оператора if нужен для случаев, когда нужно выбрать между различными непересекающимися условиями, то есть такими условиями, которые не могут наступить одновременно. Условия "a > 10" и "a < 5" не пересекаются, а "0 < a < 10" и "$a \geq 7$" пересекаются.
Переход к elif происходит, когда ТОЛЬКО ТОГДА, КОГДА вышестоящее условие в if НЕ ИСТИННО. Если же и выражение, стоящее после elif также не истинно, то осуществляется каскадный переход к нижележащему elif. Если все elif дали ложный результат, то срабатывает else. В этом плане else - последняя надежда на выбор.
О важности оператора else
- следующий пример.
# Пример о важности else! (плохой вариант)
ans = 'good' # ответ клиента
if ans == 'excellent':
code = 3
elif ans == 'good':
code = 2
elif ans == 'satisfactorily':
code = 1
print(code)
2
Если у клиента есть возможность ввести свой вариант, то может возникнуть ситуация, когда ни один из приемлимых вариантов не подошёл. Тогда сработает оператор else.
Рекомендуется всегда описывать реализацию поведения алгоритма для оператора else, даже если предыдущие условия if-elif должны были перехватить всё множество реализаций выражения условия. Особенно это актуально для операций проверки на равенство. Наличие else страхует от ошибок типа NameError: name 'f' is not defined, которые приведут к остановке работы программы.
# Пример о важности else! (хороший вариант)
# Пример: некорректно заданый входящий параметр.
# Это может быть строка в другом регистре, число, представленное в виде строки и т.д.
ans = 'Good' # ответ клиента с ошибкой (другой регистр заглавной буквы)
if ans == 'excellent':
code = 3
elif ans == 'good':
code = 2
elif ans == 'satisfactorily':
code = 1
else:
print('Another answer')
code = 0
print(code)
Another answer 0
Итого, в общем виде конструкция операторов условия выглядит так (треугольные скобки <> здесь не играют важной роли, а служат лишь для выделения выражения):
if <выражение 1>:
<строки кода 1>
elif <выражение 2>:
<строки кода 2> # код, если выражение 2 истинно, а предыдущие (1) - нет
elif <выражение 3>:
<строки кода 3> # код, если выражение 3 истинно, а предыдущие (1 и 2) - нет
else:
строки <кода 4> # код, если ни одно из выражений (1-3) не истинно
В принципе для реализации ветвления достаточно лишь условного оператора if. В таком случае код, заключённый в условный оператор, будет реализован лишь при положительном исходе (равенстве выражения истине True). В отрицательном случае (выражение равно False в логическом смысле) код не будет реализован.
Вспомним, что ноль (пустая строка, пустой список или кортеж и т.д.) в выражении даст False, а всё, что не ноль - True.
Хотя необязательно заключать выражение в скобки после оператора if, тем не менее рекомендую так делать. Скобки помогают отделить выражения и лучше обозначить их. В реализации и кодировании условий это очень важно.
# Пример подсчёта числа повторов литеры req в строку ans
ans = 'My name is Ivan Ivanov'
req = 'a'
c = 0
for letter in ans:
if letter == req: # четыре пробела для тела цикла!
c = c + 1 # четыре пробела для вложенного под условие кода!
print('There are', c, req, 'symbols in', ans)
# P.S короткий способ решить данную задачу: print ans.count('a')
There are 3 a symbols in My name is Ivan Ivanov
# Вывод на экран свойства чётности числа данной последовательности
a = range(12)
for i in a:
if i % 2 == 0:
print(i, '- even')
else:
print(i, '- odd')
0 - even 1 - odd 2 - even 3 - odd 4 - even 5 - odd 6 - even 7 - odd 8 - even 9 - odd 10 - even 11 - odd
# Пример использования условных операторов if-elif-else
x = [-55.2, 608.0, 99.5, 34.7, -15., -5.7, 0.0, 85.8, 76.9, -0.8]
print(x)
for i, xi in enumerate(x):
if xi < 0:
x[i] = x[i] + 10.0
elif xi == 0.0:
print('Zero has been found')
elif xi == 12.0:
print('Dozen is found')
else: # x > 0 and x != 12
x[i] -= 1.5
print(x)
[-55.2, 608.0, 99.5, 34.7, -15.0, -5.7, 0.0, 85.8, 76.9, -0.8] Zero has been found [-45.2, 606.5, 98.0, 33.2, -5.0, 4.3, 0.0, 84.3, 75.4, 9.2]
Конструкция с elif может быть заменена использованием множества операторов if без else. Однако в таком случае реализация случая, когда ни одно из условий не оказалось истинным, оказывается более запутанной.