Сообщить об ошибке.

Конструкция if/else в одну строку в Python

Трехместное выражение if/else в Python

Одна из основных ролей логических операторов в языке Python заключается в образовании выражений, которые выполняются так же, как условная инструкция if/else. В примере ниже записана конструкция if/else, которая вычисляет значение rez в зависимости от истинности неравенства a < b:

if a < b:
    rez = a + b
else:
    rez = a - b

Такие инструкции настолько просты, что кажется лишнем тратить на них четыре строки. В некоторых случаях может появиться желание вложить такую конструкцию if ... else внутрь другой инструкции вместо того, чтобы выполнять присваивание переменной. По этим причинам и потому что в языке C имеется похожая позволяющая записать те же действия в виде единственного выражения, в языке Python была введено трехместное выражение if/else вида

# общий вид if/else в одну строку
x = a if condition else b

# Выражение примера выше будет 
# выглядеть следующим образом
rez = a + b if a < b else a - b.

Данное выражение дает тот же результат, что и инструкция в примере выше, но выглядит она проще. Как и в предыдущей инструкции,интерпретатор выполняет выражение a + b, только если a < b имеет истинное значение, а выражение a - b выполняется, только если a < b имеет ложное значение. То есть вычисления здесь также выполняются по сокращенной схеме.

Дополнительно в однострочнике if/else можно использовать еще одно вложенное условие:

# общий вид if/else в одну строку 
# с дополнительным условием
rez = а if condition else b if condition else c

# что-бы лучше читалось, можно во 
# втором условии поставить скобочки
rez = а if condition else (b if condition else c)

Обратите внимание, что стиль написания этого выражения чем то напоминает вложенные генераторы-списков.

Однострочник if/else с дополнительным условием будет эквивалентен следующему коду:

if condition:
    rez = a
elif condition:
    rez = b
else:
    rez = c

Примеры использования if/else в одну строку:

Простое (с одним условием) if/else в одну строку:

>>> a = 6
>>> b = 5
>>> rez = a + b if a < b else a - b
>>> rez
# 1

>>> i = []
>>> rez = a + b if not i else a - b
>>> rez
# 11

При помощи однострочника if/else можно вызывать связанные функции:

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

>>> a, b = 4, 5
>>> (subtract if a > b else add)(a, b)
# 9

Пример if/else в одну строку с дополнительным условием:

>>> i = 55
>>> rez = f'{i} < 50' if i < 50 else (f'{i} > 60' if i > 60 else f'50 > {i} < 60')
>>> rez
# '50 > 55 < 60'
>>> i=45
>>> rez = f'{i} < 50' if i < 50 else (f'{i} > 60' if i > 60 else f'50 > {i} < 60')
>>> rez
# '45 < 50'
>>> i=65
>>> rez = f'{i} < 50' if i < 50 else (f'{i} > 60' if i > 60 else f'50 > {i} < 60')
>>> rez
# '65 > 60'

Если же составляющие трехместного выражения if/else достаточно сложны, то лучше использовать полноценную инструкцию if.