Условное выражение
Представьте табличку на двери магазина. На ней всегда одно из двух слов: «Открыто» или «Закрыто». Какое слово показать, решают часы: днём одно, ночью другое. Сама табличка ничего не делает, она только показывает одно из двух значений.
Программе часто нужна такая же табличка: if нужен только для того, чтобы выбрать одно из двух значений. Инструкция с двумя ветками тратит на такой выбор четыре строки и дважды повторяет имя переменной:
n = -7
if n >= 0:
sign = "plus"
else:
sign = "minus"
print(sign) # minus
sign = "plus" if n >= 0 else "minus"
print(sign) # minusДавайте сравним две записи:
- Инструкция
ifс веткойelseкладёт вsignодно из двух слов. - Строка
sign = "plus" if n >= 0 else "minus"делает то же самое в одну строку. - Обе печатают
minus, потому что-7меньше нуля.
Запись a if условие else b называют условным выражением. Если условие истинно, её значение — a, иначе — b.
Как читается запись
Условное выражение читается почти как фраза: «"plus", если n >= 0, иначе "minus"». В нём три части:
a— значение, когда условие истинно;if условие— проверка;else b— значение, когда условие ложно.
Python сначала вычисляет условие, а затем только одно из двух значений. Второе значение не вычисляется вовсе.
На собеседовании иногда спрашивают, есть ли в Python тернарный оператор, то есть выбор значения из трёх частей. Есть: это и есть условное выражение a if условие else b.
Выражение, а не инструкция
Условное выражение даёт значение, поэтому его ставят туда, где ждут значение:
- справа от
=; - в аргумент
print; - после
return.
Части else в нём нельзя пропустить: без неё выражению нечего вернуть при ложном условии. Несколько инструкций в нём выполнить нельзя. Оно только выбирает значение, а всё остальное остаётся инструкции if.
Здесь аналогия с табличкой перестаёт работать. На табличке два слова написаны раз и навсегда. В условном выражении на месте a и b может стоять любое выражение, например n * 2. Python вычисляет его заново при каждом выполнении строки.
Цепочка в одну строку
После else может стоять ещё одно условное выражение. Такая цепочка читается слева направо, как if с одной веткой elif:
def describe(n):
return "plus" if n > 0 else "minus" if n < 0 else "zero"
print(describe(5)) # plus
print(describe(-2)) # minus
print(describe(0)) # zeroРазберём три вызова:
- Сначала проверяется
n > 0. Для5оно истинно, и результат —"plus". - Для
-2оно ложно, и вычисляется вся правая часть"minus" if n < 0 else "zero". Тамn < 0истинно, и результат —"minus". - Для
0ложны оба условия, и результат —"zero".
Одного такого звена достаточно. При трёх условиях и больше понятнее инструкция if с ветками elif.
abs, min и max
Некоторые выборы встречаются так часто, что для них есть встроенные функции:
print(abs(-7), abs(7)) # 7 7
print(max(3, 8), min(3, 8, 1)) # 8 1
print(max(3, 2.0), min(2.5, 3)) # 3 2.5abs
abs(x) возвращает абсолютную величину числа — его значение без знака минус. Она заменяет выражение x if x >= 0 else -x.
max и min
max возвращает наибольший из аргументов, а min — наименьший. Аргументов может быть больше двух: min(3, 8, 1) даёт 1.
Обе функции возвращают один из своих аргументов, без преобразования типа: max(3, 2.0) даёт целое 3, а не 3.0. Запись max(a, b) даёт то же, что выражение a if a >= b else b, только короче.
Частая ошибка
В условном выражении забыли часть else:
n = -7
sign = "plus" if n >= 0 # ✗SyntaxError: expected 'else' after 'if' expressionБез else выражение не знает, какое значение дать при ложном условии, поэтому файл не запускается. Если при ложном условии ничего делать не нужно, пишите инструкцию if без else.
Главное
a if условие else bдаётaпри истинном условии иbпри ложном, и вычисляется только одно из них.- Это выражение: его ставят справа от
=, в аргумент или послеreturn, и частьelseв нём обязательна. - При трёх условиях и больше понятнее инструкция
ifс веткамиelif. maxиminвозвращают один из аргументов без преобразования типа, аabs— число без знака минус.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.