Тернарный оператор в Python

Обновлено:

1. Что такое тернарный оператор

В Python существует компактная форма условного выражения:

value_if_true if condition else value_if_false

Например:

age = 20

status = 'adult' if age >= 18 else 'child'

print(status)

Результат:

adult

Python сначала проверяет:

age >= 18

Если условие истинно, результатом всего выражения становится:

'adult'

Если условие ложно:

'child'

В документации Python такая конструкция называется conditional expression — условное выражение. На практике также часто говорят «тернарный оператор».


2. Второй пример

temperature = -5

message = 'above zero' if temperature > 0 else 'zero or below'

print(message)

Результат:

zero or below

Тернарный оператор удобен, когда нужно выбрать одно из двух простых значений.


Вычисляется только одна ветка

3. Python выбирает одну часть выражения

number = 10

result = number * 2 if number > 0 else number / 0

print(result)

Результат:

20

Часть:

number / 0

вообще не выполняется, потому что условие:

number > 0

вернуло True.

То есть порядок такой:

1. Проверить условие.
2. Выбрать одну ветку.
3. Вычислить только выбранное выражение.

Тернарный оператор внутри других выражений

4. Аргумент функции

Тернарное выражение можно сразу передать в функцию:

balance = 1500

print('positive' if balance > 0 else 'empty')

Сначала вычисляется условное выражение.

После этого его результат становится аргументом print().


5. В f-строке

balance = 0

message = (
    f'Account status: '
    f'{"active" if balance > 0 else "empty"}'
)

print(message)

Результат:

Account status: empty

Внутри фигурных скобок f-строки можно использовать обычные Python-выражения, включая условное выражение.


Тернарный оператор в return

6. Короткая функция

Обычный вариант:

def check_even_odd(number):
    if number % 2 == 0:
        return 'even'

    return 'odd'

Для такой простой логики функцию можно записать компактнее:

def check_even_odd(number):
    return 'even' if number % 2 == 0 else 'odd'

Пример:

print(check_even_odd(10))
print(check_even_odd(7))

Результат:

even
odd

Тернарное выражение особенно удобно, когда обе ветки короткие и легко читаются.


Приоритет операторов

7. Выражения слева и справа относятся к своим веткам

Рассмотрим:

a = 5
b = 20
condition = True

result = 10 + a if condition else b * 2

print(result)

Результат:

15

Эта запись воспринимается так:

result = (10 + a) if condition else (b * 2)

Если:

condition = False

результатом будет:

40

То есть целое выражение:

10 + a

относится к ветке if, а:

b * 2

к ветке else.


8. Скобки могут изменить структуру выражения

Например:

a = 5
b = 20
condition = True

result = 10 + (a if condition else b) * 2

print(result)

Сначала выполняется:

a if condition else b

Получаем:

5

После этого:

10 + 5 * 2

Результат:

20

Сравним:

10 + a if condition else b * 2

и:

10 + (a if condition else b) * 2

Это уже разные выражения.

Круглые скобки полезны не только для изменения порядка вычислений, но и для явного отображения структуры сложного кода.


Тернарный оператор и множественное присваивание

9. Одновременный выбор нескольких значений

Мы уже знаем множественное присваивание:

first_value, second_value = 10, 20

С тернарным оператором можно выбирать сразу несколько значений:

is_buy_order = True

operation, coefficient = (
    ('BUY', 1)
    if is_buy_order
    else ('SELL', -1)
)

print(operation)
print(coefficient)

Результат:

BUY
1

Если:

is_buy_order = False

будет выбрана другая пара:

SELL
-1

Это удобно, когда одно условие должно сразу определить несколько связанных значений.


Практический пример: смена ролей

10. Поочерёдное выполнение действий

Предположим, два сервера должны по очереди становиться активным и резервным:

active_server = 'server_1'
backup_server = 'server_2'

should_switch = True

active_server, backup_server = (
    (backup_server, active_server)
    if should_switch
    else (active_server, backup_server)
)

print(active_server)
print(backup_server)

Результат:

server_2
server_1

Если переключение нужно, значения меняются местами.

Если нет:

should_switch = False

они остаются прежними.


11. Такой алгоритм может использоваться внутри цикла

С циклами мы познакомимся позже, но посмотрим небольшой пример целиком:

first_player = 'Alex'
second_player = 'Max'

round_number = 1

while round_number <= 3:
    attacker, defender = (
        (first_player, second_player)
        if round_number % 2
        else (second_player, first_player)
    )

    print(
        f'Round {round_number}: '
        f'{attacker} attacks, '
        f'{defender} defends'
    )

    round_number += 1

Результат:

Round 1: Alex attacks, Max defends
Round 2: Max attacks, Alex defends
Round 3: Alex attacks, Max defends

В каждом раунде условное выражение выбирает сразу два связанных значения:

attacker
defender

Сам цикл пока достаточно воспринимать как повторение одного участка программы.


Ещё один пример множественного присваивания

12. Основная и дополнительная валюты

Допустим, программа должна выбрать порядок валют в зависимости от направления конвертации:

convert_to_usd = True

source_currency, target_currency = (
    ('GEL', 'USD')
    if convert_to_usd
    else ('USD', 'GEL')
)

print(source_currency)
print(target_currency)

Результат:

GEL
USD

Одно условие определяет сразу два связанных параметра дальнейшей бизнес-логики.


Вложенный тернарный оператор

13. Тернарные выражения можно вкладывать

Технически можно написать:

temperature = 15

status = (
    'hot'
    if temperature > 25
    else 'warm'
    if temperature >= 10
    else 'cold'
)

print(status)

Результат:

warm

Такой код работает.

По смыслу здесь:

если temperature > 25:
    hot
иначе:
    если temperature >= 10:
        warm
    иначе:
        cold

14. Вложенные тернарные выражения ухудшают читаемость

Для нескольких условий предпочтительнее обычная конструкция:

temperature = 15

if temperature > 25:
    status = 'hot'
elif temperature >= 10:
    status = 'warm'
else:
    status = 'cold'

Этот вариант длиннее, но значительно проще читать.

Тернарный оператор полезен для короткого выбора между двумя простыми вариантами.

Если логика начинает превращаться в:

одно условие
↓
другое условие
↓
третье условие

лучше использовать:

if
elif
else

Когда использовать тернарный оператор

Хороший вариант:

status = 'active' if balance > 0 else 'empty'

Хороший вариант:

return 'even' if number % 2 == 0 else 'odd'

Хороший вариант:

print('allowed' if access_is_allowed else 'blocked')

Но сложную бизнес-логику лучше оставлять обычной условной конструкцией.

Например, вместо длинного однострочника проще написать:

if condition:
    ...
else:
    ...

Главный критерий — читаемость.


Основное по теме

Синтаксис тернарного оператора:

value_if_true if condition else value_if_false

Пример:

status = 'adult' if age >= 18 else 'child'

Сначала проверяется:

condition

После этого вычисляется только одна из двух веток.

Тернарное выражение можно:

присвоить переменной
передать в функцию
использовать в f-строке
вернуть через return
объединить с множественным присваиванием

Например:

return 'positive' if number > 0 else 'not positive'

Или:

first, second = (
    (10, 20)
    if condition
    else (20, 10)
)

Технически тернарные выражения можно вкладывать друг в друга, но сложные вложенные конструкции плохо читаются.

Поэтому тернарный оператор используем прежде всего там, где он делает простую логику короче, не делая её сложнее для понимания.