Тернарный оператор в Python: как записать if-else в одну строку

Тернарный оператор в Python записывает условие одной строкой и сразу возвращает готовое значение. Разбираем синтаксис, цепочки вместо elif, применение в f-строках и списковых включениях и пять ошибок, на которых спотыкаются новички. Все примеры проверены в Python 3.14.
Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2663 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3318 экспертных мнений Подписаться на Телеграм-канал
Обложка: Тернарный оператор в Python: как записать if-else в одну строку

Чтобы записать условие в одну строку, в Python используют конструкцию значение_если_да if условие else значение_если_нет. Она возвращает готовое значение, поэтому её можно положить в переменную, в f-строку или сразу в аргумент функции.

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

CheckroiCheckroiПодборка курсов по Python570 курсов • 50 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить

Как устроен тернарный оператор

Рой показывает на экране условие, записанное одной строкой

Конструкция состоит из трёх частей и читается как фраза на английском: «верни это, если условие истинно, иначе верни то».

age = 20
status = "совершеннолетний" if age >= 18 else "несовершеннолетний"
print(status)
# совершеннолетний

Та же логика обычным if занимает четыре строки вместо одной:

Обычный if-else Тернарный оператор
if age >= 18:
    status = "совершеннолетний"
else:
    status = "несовершеннолетний"
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 и вставьте код построчно.

  1. Пропущен else. В тернарнике обе ветки обязательны: выражение всегда обязано вернуть значение. x = 5 if True даёт SyntaxError: expected 'else' after 'if' expression.
  2. Синтаксис из других языков. Знакомое по Си и JavaScript условие ? a : b в Python не работает, интерпретатор выдаёт SyntaxError: invalid syntax прямо на знаке вопроса.
  3. Присваивание внутри ветки. Тернарник возвращает значение, но не выполняет инструкции. Попытка x = 1 if c else y = 2 заканчивается подсказкой интерпретатора Maybe you meant '==' or ':=' instead of '='?.
  4. Забытые скобки при склейке строк. Сложение приоритетнее тернарника, поэтому условие захватывает всю левую часть целиком.
  5. Трюк с 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-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология161 200 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽250 000 ₽/мес.17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что такое тернарный оператор в Python?

Это условное выражение вида значение_если_да if условие else значение_если_нет. Оно проверяет условие и возвращает одно из двух значений, поэтому результат можно сразу присвоить переменной или подставить в f-строку. «Тернарным» его называют по числу операндов: условие и две ветки.

Как записать if-else в одну строку в Python?

Поставьте сначала результат, потом условие: status = "взрослый" if age >= 18 else "ребёнок". Такая запись заменяет четыре строки обычного блока if-else и работает везде, где Python ожидает значение.

Можно ли использовать тернарный оператор без else?

Нет. Обе ветки обязательны: выражение всегда должно вернуть значение, иначе переменной нечего присвоить. Запись x = 5 if True завершится ошибкой SyntaxError: expected 'else' after 'if' expression. Если ветка «иначе» не нужна, используйте обычный if без else.

Работает ли в Python запись «условие ? значение1 : значение2»?

Нет, знак вопроса и двоеточие в роли тернарного оператора Python не понимает: такая запись из Си, Java и JavaScript даёт SyntaxError: invalid syntax. В Python порядок другой, через ключевые слова if и else.

Можно ли вкладывать тернарные операторы друг в друга?

Да, ветки можно выстроить цепочкой: каждый следующий else подхватывает всё, что не подошло раньше. Две-три ветки ещё читаются, дальше выигрыш в строках теряется, и понятнее обычная конструкция if-elif-else.

Чем тернарный оператор отличается от обычного if-else?

Обычный if это инструкция: он выполняет действия, но ничего не возвращает. Тернарный оператор это выражение: он возвращает значение и может стоять внутри f-строки, спискового включения или аргумента функции. Подробнее о том, как условие управляет ходом программы, мы разбирали в статье про цикл while.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!

0 Просмотренные курсы (0)