How to use ternary conditional operator in Python?
Quick answer
Python writes the ternary as a conditional expression: value_if_true if condition else value_if_false. For example, status = 'adult' if age >= 18 else 'minor'. Python has no ? : operator — that is C and JavaScript syntax and raises a SyntaxError in Python. Because it is an expression it returns a value, so it can be used inline anywhere a value is expected.
Python's ternary is written as a conditional expression, and its word order differs from most other languages: the value comes first, then the condition.
The syntax
value_if_true if condition else value_if_falseA concrete example:
age = 20
status = 'adult' if age >= 18 else 'minor'
print(status) # adultRead it left to right as: use 'adult' — if age >= 18 — otherwise 'minor'.
Python has no ? : operator
This is the single most common mistake:
status = age >= 18 ? 'adult' : 'minor' # SyntaxError? : is C, C++, Java, JavaScript, and PHP syntax. Python deliberately uses
English keywords instead, so pasting a C-style ternary into Python raises a
SyntaxError.
It is an expression, not a statement
Because it evaluates to a value, you can use it anywhere a value is allowed:
# In an assignment
discount = 0.2 if is_member else 0.0
# As a function argument
print('yes' if flag else 'no')
# Inside an f-string
message = f"{count} item{'s' if count != 1 else ''}"
# Inside a list comprehension
clamped = [x if x > 0 else 0 for x in numbers]Note the comprehension case: the ternary goes before the for. An if
placed after the for is a filter and means something different:
[x if x > 0 else 0 for x in numbers] # transform: keeps every element
[x for x in numbers if x > 0] # filter: drops non-matching elementsThe else is mandatory
x = 1 if cond # SyntaxError — no else
x = 1 if cond else 2 # validA conditional expression must always produce a value, so both branches are
required. If you only want a side effect, use a normal if statement.
Branches must be expressions
You cannot put statements such as return, raise, or an assignment inside a
branch:
# Valid — the return wraps the whole expression
def pick(cond, a, b):
return a if cond else bWhen not to use it
Chaining is legal but degrades quickly:
# Hard to scan
label = 'low' if n < 10 else 'mid' if n < 100 else 'high'Past two conditions, prefer an explicit block:
if n < 10:
label = 'low'
elif n < 100:
label = 'mid'
else:
label = 'high'Related: the or idiom
For "use this unless it is falsy", or is often shorter:
name = user_input or 'anonymous'Be careful: this treats 0, '', and [] as falsy. When only None should
trigger the fallback, be explicit:
name = user_input if user_input is not None else 'anonymous'Key takeaways
- •Python's syntax is `A if condition else B` — the value comes first, not the condition.
- •There is no `? :` operator in Python; writing it raises SyntaxError.
- •It is an expression, not a statement, so it returns a value and can be assigned, passed as an argument, or used inside a comprehension.
- •The else branch is mandatory — `x = 1 if cond` is invalid, unlike a plain if statement.
- •Only expressions are allowed in the branches: you cannot put return, raise, or an assignment inside one.
- •Chaining ternaries is legal but hurts readability fast — past two conditions, use a normal if/elif block or a dict lookup.
Frequently asked questions
What is the ternary operator syntax in Python?
value_if_true if condition else value_if_false. For example status = 'adult' if age >= 18 else 'minor' assigns 'adult' when age is 18 or more and 'minor' otherwise. Python evaluates the condition first, then returns whichever branch applies.
Does Python support the C-style condition ? a : b?
No. Python deliberately has no ?: operator, and writing it produces a SyntaxError. Python uses the English-keyword form A if C else B for readability instead. If you have seen ? :, that is C, C++, Java, JavaScript, or PHP syntax.
Can I omit the else branch?
No. The else is mandatory because a conditional expression must always produce a value, so x = 1 if cond is a SyntaxError. If you only want to act conditionally without producing a value, use a normal if statement instead.
Can I use a ternary inside a list comprehension?
Yes, and it is a common pattern: [x if x > 0 else 0 for x in numbers] clamps negatives to zero. Note the position — the ternary goes before the for, which differs from a filtering if, which goes after it.
Can I put a return or raise inside a ternary?
No. The branches must be expressions, and return and raise are statements. Writing return a if cond else b works because the return wraps the whole expression, but x = return a if cond else b is invalid. Use a normal if block when you need statements.
When should I avoid the ternary operator?
When it stops being readable. Nested or chained ternaries covering three or more cases are hard to scan — prefer an if/elif/else block, or map the cases in a dictionary and look them up, which is usually clearer and easier to extend.
Software Engineering Leader & Technical Author · Updated July 21, 2026