Перейти к содержимому
Теория · Условия · урок 5 из 8

Условное выражение

Представьте табличку на двери магазина. На ней всегда одно из двух слов: «Открыто» или «Закрыто». Какое слово показать, решают часы: днём одно, ночью другое. Сама табличка ничего не делает, она только показывает одно из двух значений.

Программе часто нужна такая же табличка: if нужен только для того, чтобы выбрать одно из двух значений. Инструкция с двумя ветками тратит на такой выбор четыре строки и дважды повторяет имя переменной:

Python
n = -7
if n >= 0:
    sign = "plus"
else:
    sign = "minus"
print(sign)  # minus

sign = "plus" if n >= 0 else "minus"
print(sign)  # minus

Давайте сравним две записи:

  1. Инструкция if с веткой else кладёт в sign одно из двух слов.
  2. Строка sign = "plus" if n >= 0 else "minus" делает то же самое в одну строку.
  3. Обе печатают 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:

Python
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

Разберём три вызова:

  1. Сначала проверяется n > 0. Для 5 оно истинно, и результат — "plus".
  2. Для -2 оно ложно, и вычисляется вся правая часть "minus" if n < 0 else "zero". Там n < 0 истинно, и результат — "minus".
  3. Для 0 ложны оба условия, и результат — "zero".

Одного такого звена достаточно. При трёх условиях и больше понятнее инструкция if с ветками elif.

abs, min и max

Некоторые выборы встречаются так часто, что для них есть встроенные функции:

Python
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.5

abs

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:

Python
n = -7
sign = "plus" if n >= 0  # ✗
TEXT
SyntaxError: expected 'else' after 'if' expression

Без else выражение не знает, какое значение дать при ложном условии, поэтому файл не запускается. Если при ложном условии ничего делать не нужно, пишите инструкцию if без else.

Главное

  • a if условие else b даёт a при истинном условии и b при ложном, и вычисляется только одно из них.
  • Это выражение: его ставят справа от =, в аргумент или после return, и часть else в нём обязательна.
  • При трёх условиях и больше понятнее инструкция if с ветками elif.
  • max и min возвращают один из аргументов без преобразования типа, а abs — число без знака минус.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом