Тернарный оператор в 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)
)
Технически тернарные выражения можно вкладывать друг в друга, но сложные вложенные конструкции плохо читаются.
Поэтому тернарный оператор используем прежде всего там, где он делает простую логику короче, не делая её сложнее для понимания.