Where it earns its place
Because it is an expression, it fits where a statement cannot:
f"You {'passed' if ok else 'failed'}"
["even" if n % 2 == 0 else "odd" for n in nums]
func(timeout if timeout else 30)
Inside an f-string, inside a comprehension, as an argument. A four-line if cannot go in any of those places, so the choice is not style — it is the only form that fits.
The else is not optional
An expression has to produce a value on every path, so there is no one-armed version. x = 1 if cond is a syntax error. If you want "set it only sometimes", that is a statement, and the statement form is what you want.
Where it stops helping
Chaining is legal:
"A" if s >= 90 else "B" if s >= 80 else "C" if s >= 70 else "F"
and it is the point where the form has outlived its usefulness. The reader has to scan to the end to find the default, and inserting a new band means editing the middle of a long line. The page prints the chained version beside a plain sequence of if statements; they agree on every input, and only one of them can be read at a glance.
The rule that holds up: one condition, short values, one line. Two conditions, write the statement.
The `or` lookalike
This is the most common way the idea goes wrong:
return value or "default"
It looks like "use the default when value is missing", and it is really "use the default when value is falsy" — which includes 0, "", [] and False. If 0 is a legitimate value, or silently discards it.
return value if value is not None else "default"
says what was meant. The page runs both over "set", "", 0 and None so the divergence is visible rather than theoretical.