Чтобы записать условие в одну строку, в Python используют конструкцию значение_если_да if условие else значение_если_нет. Она возвращает готовое значение, поэтому её можно положить в переменную, в f-строку или сразу в аргумент функции.
Официально эта запись называется условным выражением, а «тернарным оператором» его называют по числу операндов: условие и две ветки. Порядок слов тут непривычный: сначала результат, только потом условие. Именно на нём спотыкаются те, кто пришёл из Си или JavaScript, а в Python перешёл недавно.
Как устроен тернарный оператор

Конструкция состоит из трёх частей и читается как фраза на английском: «верни это, если условие истинно, иначе верни то».
age = 20
status = "совершеннолетний" if age >= 18 else "несовершеннолетний"
print(status)
# совершеннолетний
Та же логика обычным if занимает четыре строки вместо одной:
| Обычный if-else | Тернарный оператор |
|---|---|
if age >= 18: |
status = "совершеннолетний" if age >= 18 else "несовершеннолетний" |
Главное отличие от привычного if в том, что тернарник это выражение, а не инструкция. Инструкция что-то делает, выражение возвращает значение. Поэтому тернарник можно поставить туда, где Python ждёт значение, а полноценный блок if там не пройдёт.
В справочнике языка порядок вычисления описан точно: сначала проверяется условие, и только потом вычисляется нужная ветка. Вторая не выполняется вообще.
a, b = 10, 0
print(a / b if b != 0 else "делить нельзя")
# делить нельзя
Деления на ноль не происходит: до левой ветки очередь просто не доходит. На этом свойстве держатся безопасные проверки: сначала убеждаемся, что делитель или ключ на месте, и только потом лезем за значением. Условие тут работает так же, как в цикле while, где оно решает, войдёт ли программа в тело.
Где он экономит строки
Тернарник стоит брать там, где по смыслу получается одно значение, а обычный if раздувает это до четырёх строк. Вот места, где он выглядит уместно.
- Внутри f-строки: слово в сообщении зависит от данных.
- В списковых включениях: каждый элемент преобразуется по условию.
- В аргументе функции или в
return: значение по умолчанию зависит от проверки.
n = 7
print(f"Число {n} — {'чётное' if n % 2 == 0 else 'нечётное'}")
# Число 7 — нечётное
nums = [4, -2, 9, -7, 0]
signs = ["плюс" if x > 0 else "минус" if x < 0 else "ноль" for x in nums]
print(signs)
# ['плюс', 'минус', 'плюс', 'минус', 'ноль']
def greet(name=None):
return f"Привет, {name if name else 'гость'}!"
print(greet("Аня")) # Привет, Аня!
print(greet()) # Привет, гость!
Особенно часто тернарник выручает на согласовании слов, там, где иначе пришлось бы городить отдельную ветку ради одной буквы.
items = ["яблоко"]
print(f"Найдено {len(items)} {'товар' if len(items) == 1 else 'товара'}")
# Найдено 1 товар
Тот же приём работает и при обработке коллекций — например, когда нужно просуммировать список, пропуская значения, которые не проходят проверку.
Ещё тернарник часто подставляет заглушку вместо пустого поля. Пустая строка, ноль и None в Python считаются ложными, поэтому одна проверка закрывает сразу все три случая.
users = [{"name": "Аня", "age": 0}, {"name": "Борис", "age": 34}]
for u in users:
print(u["name"], "—", u["age"] if u["age"] else "возраст не указан")
# Аня — возраст не указан
# Борис — 34
Работает тернарник и внутри lambda: например, когда нужно отправить записи без данных в конец списка при сортировке.
key = lambda x: x["age"] if x["age"] else 999
print([u["name"] for u in sorted(users, key=key)])
# ['Борис', 'Аня']
Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяЦепочка условий вместо elif
Прямого аналога elif у тернарника нет, но ветки можно выстроить цепочкой. Условия проверяются по порядку сверху вниз, а каждый следующий else подхватывает всё, что не подошло раньше.
score = 75
grade = ("отлично" if score >= 90
else "хорошо" if score >= 70
else "удовлетворительно" if score >= 50
else "неудовлетворительно")
print(grade)
# хорошо
Цепочка из двух-трёх веток ещё читается, из четырёх и больше уже нет. Как только условий становится много, выигрыш в строках оборачивается проигрышем во времени на чтение, и обычный if-elif-else оказывается честнее.
Пять ошибок, которые ловят новичков

Все примеры ниже запускались в Python 3.14, сообщения об ошибках приведены такими, какими их печатает интерпретатор. Повторить их у себя можно за минуту: создайте файл Python в VS Code и вставьте код построчно.
- Пропущен
else. В тернарнике обе ветки обязательны: выражение всегда обязано вернуть значение.x = 5 if TrueдаётSyntaxError: expected 'else' after 'if' expression. - Синтаксис из других языков. Знакомое по Си и JavaScript
условие ? a : bв Python не работает, интерпретатор выдаётSyntaxError: invalid syntaxпрямо на знаке вопроса. - Присваивание внутри ветки. Тернарник возвращает значение, но не выполняет инструкции. Попытка
x = 1 if c else y = 2заканчивается подсказкой интерпретатораMaybe you meant '==' or ':=' instead of '='?. - Забытые скобки при склейке строк. Сложение приоритетнее тернарника, поэтому условие захватывает всю левую часть целиком.
- Трюк с
andиorвместо тернарника. Он ломается молча, а это опаснее синтаксической ошибки.
Четвёртая ошибка выглядит безобидно, но результат отличается от ожидаемого:
vip = False
print("Здравствуйте, " + "VIP" if vip else "гость")
# гость ← приветствие потерялось
print("Здравствуйте, " + ("VIP" if vip else "гость"))
# Здравствуйте, гость ← так правильно
Пятая ошибка историческая. До появления тернарника условие в одну строку писали через and и or, и эта запись давала неверный ответ, когда левое значение оказывалось ложным: нулём, пустой строкой или пустым списком.
cond, a = True, 0
print(cond and a or "запасное") # запасное ← неверно, ждали 0
print(a if cond else "запасное") # 0 ← верно
Это не мелочь: в PEP 308, документе, которым тернарник ввели в язык, распространённость таких ошибок названа главной причиной его появления. Предложение написали ещё в 2003 году, а в язык конструкция попала в версии 2.5.
Проверять такие вещи удобнее не в голове, а в интерпретаторе: запустите оба варианта рядом и сравните вывод.
Когда лучше оставить обычный if

Тернарник выигрывает только там, где обе ветки короткие и по смыслу дают одно значение. В остальных случаях он мешает.
- В ветке больше одного действия: несколько инструкций туда записать всё равно не получится.
- Строка уезжает за экран: длинное условие плюс две длинные ветки читаются хуже четырёх коротких строк.
- Нужен только один исход: если действия для «иначе» нет, честнее обычный
ifбезelse.
Хорошая проверка простая: прочитайте строку вслух. Если сбились на середине, разверните в обычный блок. Умение выбирать между краткостью и читаемостью приходит с практикой, и оно заметно важнее, чем знание самого синтаксиса.
Где освоить Python системно
Одна конструкция закрывает одну задачу, а работа начинается там, где из таких инструментов собирается программа. Дальше идут функции, структуры данных, работа с файлами и библиотеками. Их проще разбирать по выстроенной программе, чем собирать по отдельным заметкам.
Ниже собраны курсы Python с практикой и проверкой кода: можно сравнить форматы и длительность, а заодно посмотреть, как устроен путь Python-разработчика целиком.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 161 200 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | 250 000 ₽/мес. | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




