Тернарные операции в Python
Очень часто новички в Python не могут разобраться с тернарными операторами. Помимо путаницы с тем, что же называют тернарным оператором, их часто пытаются применить не к месту. Однако тернарные операции очень удобны, и откладывать их изучение — значит усложнять себе работу.
Тернарная условная операция
В программировании тернарная (от лат. ternarius — «тройной») условная операция состоит из условного выражения и двух аргументов. В зависимости, от результата вычисления условного выражения, тернарная операция вернет один из аргументов.
Тернарные условные операции используются в разных языках программирования. Впервые они появились в Algol-60, где имели такую форму:
if <условие> then <значение 1> else <значение 0>
В некоторых языках (в основном, испытавших влияние C) подобные операции обозначают символами ?:
:
<условие> ? <значение 1> : <значение 2>
Тернарные операторы в Python
В Python тернарные операции имеют простой и понятный синтаксис:
<Значение 1> if <условие> else <значение 0>
Это делает понимание кода интуитивным. Такие строки читаются, как предложения на английском. Например,
x = 'today' if date == today else date
можно прочитать как "Икс равно 'today' если дата сегодняшняя, а иначе — дате". Такая лаконичная запись эстетичнее, чем простые условные блоки, однако имеет свои ограничения. Например, вы не можете использовать в ней break
, continue
, pass
и другие полезные инструкции.
Не стоит путать тенрарные операторы с однострочной записью if
:
a, min = 10, 3
if a > min: print(a); print(a - min)
# 10, 7
В этом случае, если а
больше min
, все действия после двоеточия будут выполнены последовательно, а иначе — просто пропущены.
Не забывайте, что операторы сравнения имеют наименьший приоритет. Изменить его можно с помощью скобок:
x = (a if a > b else b) - c
Тернарные операции могут быть вложенными.
x = (
a if a != 0 else
b if b != 0 else
c if c != 0 else
d
)
Очень часто тернарные операции используются в генераторах и списковых включениях. Это единственный способ заменить значения, не подходящие по условию.
lst = [-9, 2, 0]
g = (i if i >= 0 else 0 for i in lst)
# 0 2 0
lc = [-i if i < 0 else 0 for i in lst]
# [9, 0, 0]
Обратите внимание, что тернарные операторы используют перед for
. После этой инструкции нельзя использовать else
.
Пользуясь тем, что True == 1
, а False == 0
, в записи тернарных операций можно обойтись вообще без if
и else
:
('AM', 'PM')[a >= 12]
Если выражение возвращает False
, из кортежа будет выбран нулевой элемент, а если True
- первый.
Заключение
Тернарные операции — удобный способ записать условный блок в одну строку. Это делает код более лаконичным и понятным. Их можно использовать в генераторах и списковых включениях. Вложенные тернарные операторы помогают сокращать блоки if-elif-else
, однако их возможности не безграничны, и не всякий условный блок можно заменить.
Возможно будет интересно
Условные конструкции и сопоставление структурных шаблонов
Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов