Урок №16. Ветвления. Составные условия.
Условный оператор предназначен для выбора из двух вариантов действий. После служебного слова if (если) записывается некоторое условие; если оно истинно, то выполняется блок операторов, расположенный далее. Вторая (необязательная) часть условного оператора начинается словом else (иначе), сразу после него записывается блок операторов, которые выполняются, если условие после слова if ложно.
Возможности, описанные в предыдущих параграфах, позволяют писать линейные программы, в которых операторы выполняются последовательно друг за другом, и порядок их выполнения не зависит от входных данных.
В большинстве реальных задач порядок действий может изменяться в зависимости от того, какие данные поступили. Например, программа для системы пожарной сигнализации должна выдавать сигнал тревоги, если данные с датчиков показывают повышение температуры или задымлённость.
Для этой цели в языках программирования предусмотрены условные операторы. Например, для того чтобы записать в переменную М максимальное из значений переменных а и Ь, можно использовать оператор:
if а > Ь:
М = а
else:
М = b
Если истинно (верно) условие, записанное после ключевого слова if, то затем выполняются все команды (блок команд), которые расположены до слова else. Если же условие после if ложно (неверно), выполняются команды, стоящие после else.
Обратите внимание, что после условия и после слова else ставятся двоеточия.
В Python, в отличие от других языков, важную роль играют сдвиги операторов относительно левой границы (отступы). Слова if и else начинаются на одном уровне, а все команды внутренних блоков сдвинуты относительно этого уровня вправо на одно и то же расстояние. Это позволяет не использовать особые ограничители блоков (слова begin и end в языке Паскаль, фигурные скобки в С-подобных языках). Для сдвига используют символы табуляции (которые вставляются при нажатии на клавишу Tab) или пробелы.
Если в блоке всего один оператор, иногда бывает удобно записать его в той же строке, что и ключевое слово if (else):
if а > b: М = а
else: М = b
В приведённых примерах условный оператор записан в полной форме: в обоих случаях (истинно условие или ложно) нужно выполнить некоторые действия. Программа выбора максимального значения может быть написана иначе:
М = а
if b > а:
М = b
Здесь использован условный оператор в неполной форме, потому что в случае, когда условие ложно, ничего делать не требуется (нет слова else и блока операторов после него).
Поскольку операция выбора максимального из двух значений нужна очень часто, в Python есть встроенная функция max, которая вызывается так:
М = mах(а, b)Если выбирается максимальное из двух чисел, можно использовать особую форму условного оператора в Python:
М = a if а > b else bкоторая работает так же, как и приведённый выше условный оператор в полной форме: записывает в переменную М значение а, если выполняется условие а > b, и значение b, если это условие ложно.
Часто при каком-то условии нужно выполнить сразу несколько действий. Например, в задаче сортировки значений переменных а и b по возрастанию нужно поменять местами значения этих переменных, если а > b:
if а > Ь:
с = а
а = b
b = с
Все операторы, входящие в блок, сдвинуты на одинаковое расстояние от левого края. Заметим, что в Python, в отличие от многих других языков программирования, есть множественное присваивание, которое позволяет выполнить эту операцию значительно проще:
а, b = b, аКроме знаков < и > в условиях можно использовать другие знаки отношений: <= (меньше или равно), >= (больше или равно), == (равно — два знака «=» без пробела, чтобы отличить от операции присваивания) и != (не равно).
Внутри условного оператора могут находиться любые операторы, в том числе и другие условные операторы. Например, пусть возраст Андрея записан в переменной а, а возраст Бориса — в переменной b. Нужно определить, кто из них старше. Одним условным оператором тут не обойтись, потому что есть три возможных результата: старше Андрей, старше Борис и оба одного возраста. Решение задачи можно записать так:
if а > Ь:
print("Андрей старше")
else:
if а == b:
print("Одного возраста")
else:
print("Борис старше")
Условный оператор, проверяющий равенство, находится внутри блока «иначе» (else), поэтому он называется вложенным условным оператором. Как видно из этого примера, использование вложенных условных операторов позволяет выбрать один из нескольких (а не только из двух) вариантов. Если после else сразу следует ещё один оператор if, можно использовать так называемое «каскадное» ветвление с ключевыми словами elif (сокращение от else if): если очередное условие ложно, выполняется проверка следующего условия и т. д.
if а > Ь:
print("Андрей старше")
elif а == Ь:
print("Одного возраста")
else:
print("Борис старше")
Обратите внимание на отступы: слова if, elif и else находятся на одном уровне!
Если в цепочке if-elif-elif-… выполняется несколько условий, то срабатывает первое из них. Например, программа
if cost < 1000:
print("Скидок нет.")
elif cost < 2000:
print("Скидка 2%.")
elif cost < 5000:
print ("Скидка 5%.")
else:
print("Скидка 10%.")
при cost = 1500 выдаёт Скидка 2%., хотя условие cost < 5000 тоже выполняется.
Предположим, что ООО «Слонопотам* набирает сотрудников, возраст которых от 25 до 40 лет включительно. Нужно написать программу, которая запрашивает возраст претендента и выдаёт ответ: подходит он или не подходит по этому признаку.
В качестве условия в условном операторе можно указать любое логическое выражение, в том числе сложное условие, составленное из простых отношений с помощью логических операций (связок) И, ИЛИ и НЕ (см. главу 3). В языке Python они записываются английскими словами and, or и not.
Пусть в переменной v записан возраст сотрудника. Тогда нужный фрагмент программы будет выглядеть так:
if v >= 25 and v <= 40:
print("Подходит")
else:
print("He подходит")
При вычислении сложного логического выражения действия выполняются в следующем порядке:
- отношения (<, <=, >, >=, ==, !=),
- операции not,
- операции and,
- операции or.
Одинаковые операции выполняются слева направо. Для изменения порядка действий используют круглые скобки.
Иногда условия получаются достаточно длинными, и их хочется перенести на следующую строку. Сделать это в Python можно двумя способами: использовать обратный слэш (это не рекомендуется):
if v >= 25 \
and v <= 40:
или взять всё условие в скобки (перенос внутри скобок разрешён):
if (v >= 25
and v <= 40):
В языке Python разрешены двойные неравенства, например
if А < В < С:
означает то же самое, что и
if А < В and В < С:
Задачи.
Даны три числа: a, b и c. Найди наибольшее из них.
Решение.
Сравним число a с числом b и числом c. Если число a больше и числа b, и числа c, то a — это и есть наибольшее число. В противном случае наибольшим будет одно из двух оставшихся чисел, поэтому нужно сравнить число b с числом c. Если число b больше числа c, то b — это наибольшее число. Если нет, то c — это наибольшее число.
a = int(input("Введите a: "))
b = int(input("Введите b: "))
c = int(input("Введите c: "))
if a > b and a > c:
print("Наибольшее число", a)
elif b > c:
print("Наибольшее число", b)
else:
print("Наибольшее число", c)
Задача.
Даны три числа x, y и z. Определи, являются ли они попарно различными.
Решение.
Составить условие, которое проверяет, что x не равен y, y не равен z и x не равен z. Использовать логический оператор И (and) для соединения трех сравнений. Если условие истинно, то числа попарно различны. Если нет, то числа не попарно различны.
x = int(input("Введите x: ")) # Вводим x
y = int(input("Введите y: ")) # Вводим y
z = int(input("Введите z: ")) # Вводим z
# Составляем условие с помощью логического оператора И (and)
if x != y and y != z and x != z:
print("Числа попарно различны") # Выводим сообщение, если условие истинно
else:
print("Числа попарно не различны") # Выводим сообщение, если условие ложно