python 三項演算子の基本から応用まで:内包表記・優先順位も解説

この記事ではPythonの三項演算子(条件式)でif文を1行化する基本構文「A if 条件 else B」から、elif相当の書き方やネスト時の注意、リスト内包表記・ラムダ式との組み合わせまで解説。代入や分岐を簡潔に書きたい、可読性を保って短くまとめたい悩みを解決できます。

目次

Pythonの三項演算子(条件式)とは:ifを1行で書く基本

python+ternary+operator

Pythonの三項演算子(正確には「条件式」)は、条件に応じて返す値を1行で切り替えられる書き方です。if文のようにブロックを作らず、「値を決めて代入したい」「式の中で分岐したい」といった場面でよく使われます。この記事のキーワードである「python 三項演算子」を理解する上では、まず基本構文・評価順序・if文との使い分け・可読性の判断基準を押さえるのが近道です。

三項演算子の基本構文と評価される順序

Pythonの三項演算子(条件式)の基本構文は次の形です。

値1 if 条件 else 値2

意味は「条件が真なら値1、偽なら値2」です。C言語などの 条件 ? 値1 : 値2 とは順序が異なり、Pythonでは「真のときの値」が先に来る点が特徴です。

評価される順序(どこが実行されるか)も重要です。条件式は、必ず次の流れで評価されます。

  • まず条件を評価する
  • 条件が真(True)なら、値1のみを評価して返す(値2は評価されない
  • 条件が偽(False)なら、値2のみを評価して返す(値1は評価されない

この「片方だけが評価される」性質は、計算コストの高い処理や、実行すると副作用が起こる処理が絡むときに挙動へ影響します。例えば、条件が真なら右側(else側)の式は実行されません。

# 条件がTrueなので、else側の式は評価されない
result = "OK" if True else (1 / 0)  # ZeroDivisionErrorにならない

代入に使う定番パターン(if文との書き分け)

python 三項演算子が最も活躍するのは「条件に応じて変数へ代入する値を決めたい」ケースです。if文で書くと複数行になる処理を、条件式なら1行で表現できます。

典型例は、フラグに応じてラベルやメッセージを出し分けるような代入です。

status = "有効" if is_active else "無効"

同じ内容をif文で書くと次のようになります。

if is_active:
    status = "有効"
else:
    status = "無効"

書き分けの目安は、「分岐の結果が“値”として自然に表現できるか」です。条件式はあくまで“式”なので、次のような場面に向きます。

  • 分岐の結果が1つの値(文字列、数値、オブジェクトなど)として決まる
  • 代入・引数・戻り値など、式が置ける場所で分岐したい

一方、分岐ごとに複数の処理(ログ出力、複数変数の更新、例外処理など)を行うなら、1行に詰めるよりif文のほうが意図が明確になります。条件式は「代入のための短縮記法」として使うと、読み手の理解が早くなりやすいです。

可読性の観点で使うべきケース/避けるべきケース

三項演算子(条件式)は便利ですが、読みやすさを最優先にすると「使うべき場面」と「避けるべき場面」がはっきり分かれます。可読性を保つコツは、1行で意味が即座に伝わるかを基準にすることです。

使うべきケース(可読性が上がりやすい):

  • 短い条件で、返す値も短い(例:ラベル、簡単な数値、軽い式)
  • 「AならX、そうでなければY」という意図が明確な代入
discount_rate = 0.1 if is_member else 0.0

避けるべきケース(読みにくくなりやすい):

  • 条件が長い・比較が多い・否定が絡むなど、視認性が落ちる
  • 返す値側で複雑な計算や関数呼び出しが並ぶ
  • 1行に情報を詰め込みすぎて、意図が追いにくい

特に、条件と返す値の両方が長いと、1行で書けても読み手は頭の中で再構成が必要になります。その場合はif文に戻すだけで理解コストが下がることが多いです。三項演算子は「短く書ける」こと自体が目的ではなく、短く書いた結果として読みやすいときに使うのが安全です。

三項演算子の応用:elif相当・elseなし・ネストの扱い

python+ternary+operator

Pythonの三項演算子(条件式)は「A if 条件 else B」が基本ですが、実務では単純な2分岐だけでなく、elif相当の多分岐や「elseを省きたい」ケース、さらには入れ子(ネスト)での表現が必要になることがあります。ここでは、python 三項演算子を応用するときに押さえておきたい書き方と、読みやすさを保つための考え方に絞って解説します。

if-elif-elseを1行で表現する方法(チェーン)

if-elif-elseのような多分岐は、三項演算子を「チェーン」して1行にまとめられます。ポイントは、「else側にさらに三項演算子を書く」ことで、elifのような分岐を作ることです。

# 例:点数から評価を決める(if-elif-else相当)
score = 72
grade = "A" if score >= 80 else "B" if score >= 60 else "C"

この書き方は右結合(右側に寄って評価される)として読むと理解しやすく、上記は次のような構造です。

# イメージ(括弧で明示)
grade = "A" if score >= 80 else ("B" if score >= 60 else "C")

チェーンは「短い条件・短い返り値」に向きます。一方で条件が増えるほど視線移動が増えて誤読しやすくなるため、分岐が3〜4個を超える/条件が長い場合は無理に1行化せず、読みやすさを優先するのが安全です。

elseを書かない「ifだけ」の代替手段と注意点

Pythonの三項演算子は仕様上、必ずelseが必要です(A if 条件だけでは構文エラー)。それでも「条件が真のときだけ値を返し、偽なら“何も返さない(あるいはNone)”」に近い表現をしたい場面があります。代表的な代替手段は次の2つです。

1) 偽のときに明示的にNoneなどを返す

# 条件を満たすときだけ値を採用し、そうでなければNone
user_name = name if name != "" else None

「elseが不要」という要求を、“偽の場合のデフォルト値を決める”ことで満たす考え方です。後段の処理がNoneを許容する設計なら、意図が明確になります。

2) and/orを使った擬似的な書き方(非推奨寄り)

# 条件が真なら値、偽ならNone(のつもり)
result = condition and value

これは「条件が真ならvalueが評価される」点では近いですが、value自体が偽になり得る(例:0""[])場合、期待と異なる結果になります。また、condition and A or Bのような古典的パターンは、Aが偽になり得ると破綻しやすく、三項演算子があるPythonでは避けるのが無難です。

結論として、「elseなし」を狙うなら、三項演算子で偽側の戻り値を明示する(例:Noneや空文字など)か、そもそも1行にこだわらず別の表現にするのが安全です。

条件式のネスト(入れ子)と可読性を保つコツ

三項演算子はネスト(入れ子)も可能ですが、ネストが深くなると「どのelseがどのifに対応するのか」が読み取りづらくなります。特に条件と返り値が長い場合、可読性の劣化が急激です。

可読性を保つコツは次のとおりです。

  • ネストは2段までを目安にし、増えるなら分けて書く(同じ1行内に押し込めない)
  • 括弧で対応関係を明示し、誤読を防ぐ(チェーン・ネストでは特に有効)
  • 返す値・条件を短く保つ(長い式は事前に変数へ切り出す)
  • 1行に固執せず、改行して視認性を上げる(括弧内で改行すると読みやすい)
# 例:ネストを括弧と改行で読みやすくする
label = (
    "high" if x >= 80 else
    ("mid" if x >= 60 else "low")
)

このように、python 三項演算子をネストする場合は「書けるか」よりも「他人(未来の自分)が一目で誤解しないか」を基準に整形することが重要です。条件式は便利な反面、複雑さが増すとバグの温床になりやすいため、短く・浅く・明示的にを意識して扱いましょう。

内包表記と三項演算子を組み合わせる

python+ternary+comprehension

Pythonでは、内包表記(comprehension)と三項演算子(条件式)を組み合わせることで、「コレクションを生成しながら、要素ごとに条件で値を出し分ける」処理を1行で表現できます。python 三項演算子の実用シーンとして特に多いのが、リストや辞書を作る前処理(整形・ラベリング・欠損補完など)です。ただし、内包表記には「条件で残す(フィルタ)」用途のifもあるため、どちらを使うべきかを整理しておくと読みやすさが大きく改善します。

リスト内包表記×条件式(要素を条件で出し分ける)

リスト内包表記の式部分に三項演算子を置くと、各要素を「変換しながら条件に応じて値を切り替える」ことができます。基本形は次のとおりです。

result = [A if 条件 else B for x in iterable]

たとえば、数値のリストを「正ならそのまま、負なら0に丸める」ケースは、if文よりもデータ変換の意図がまとまって見えます。

nums = [3, -2, 0, 5, -1]
clamped = [n if n >= 0 else 0 for n in nums]
# [3, 0, 0, 5, 0]

文字列の整形でも有効です。空文字をプレースホルダーに置き換える例では、要素単位の出し分けが明確になります。

names = ["Alice", "", "Bob", ""]
normalized = [s if s else "(unknown)" for s in names]
# ["Alice", "(unknown)", "Bob", "(unknown)"]

ここでのポイントは、三項演算子が「要素を作る側(式)」に効いていることです。つまり、全要素を結果に残しつつ、値だけを条件で変えるときに向いています。

条件フィルタ(if)との違い:残す/変換するの使い分け

内包表記の末尾に置くifは「条件を満たす要素だけを残す(フィルタ)」ための構文です。一方、三項演算子は「残す要素数は変えず、値を変換する」ために使われます。似ているようで目的が違うため、混同すると意図が伝わりにくくなります。

1) フィルタ(残す):条件に合うものだけ結果に入れる

nums = [3, -2, 0, 5, -1]
positives = [n for n in nums if n > 0]
# [3, 5]

2) 三項演算子(変換する):全要素を結果に入れつつ値を出し分ける

nums = [3, -2, 0, 5, -1]
flagged = ["pos" if n > 0 else "non-pos" for n in nums]
# ["pos", "non-pos", "non-pos", "pos", "non-pos"]

両者を組み合わせることもできます。たとえば「負数は除外し、0は’zero’、正数はそのまま」というように、フィルタと変換が別目的で共存する場合です。

nums = [3, -2, 0, 5, -1]
processed = ["zero" if n == 0 else n for n in nums if n >= 0]
# [3, "zero", 5]
  • 残す/除外するが主目的なら末尾のif(フィルタ)
  • 値を出し分ける/整形するが主目的なら式側の三項演算子(python 三項演算子

この使い分けを意識すると、内包表記の読み手が「結果の要素数が変わるのか、値だけ変わるのか」を瞬時に判断でき、保守性が上がります。

辞書・集合内包表記での条件分岐(必要な場合のみ)

三項演算子は、辞書内包表記・集合内包表記でも同様に活用できます。ただし、辞書の場合は「キーが変わると衝突(上書き)」が起きやすく、集合の場合は「重複が消える」ため、条件分岐を入れるなら影響を理解して必要な場面だけに絞るのが安全です。

辞書内包表記:値を条件で出し分ける

scores = {"ann": 82, "bob": 59, "cyd": 73}
labels = {name: ("pass" if score >= 60 else "fail") for name, score in scores.items()}
# {"ann": "pass", "bob": "fail", "cyd": "pass"}

この形は、キーは固定で「値(ラベルや整形結果)だけを切り替える」ので安全性が高く、python 三項演算子の恩恵が出やすいパターンです。

集合内包表記:要素を条件で正規化して集約する

words = ["Python", "python", "PYTHON", "Java"]
normalized_set = {w.lower() if w.isupper() else w for w in words}
# {"python", "Java"}

集合は同じ要素が1つにまとまるため、条件で変換した結果が同一化される可能性があります。意図せず要素数が減ることがあるので、「変換後に重複しても問題ない」場合に限定して使うと安心です。

ラムダ式(無名関数)と三項演算子を組み合わせる

python+ternary+lambda

Pythonでは、lambda(ラムダ式)で小さな関数をその場で定義できます。ここにpython 三項演算子(条件式)を組み合わせると、「入力に応じて返す値を切り替える」ような処理を短く記述できます。

ただし、ラムダ式はあくまで簡潔さが強みである一方、条件が増えたり処理が複雑になると読みづらくなりがちです。このセクションでは、ラムダ内での条件分岐の書き方と、関数化へ切り替える判断基準を整理します。

lambda内での条件分岐(簡潔に書くパターン)

ラムダ式の本体は「式」しか書けないため、if文(複数行の制御構文)ではなく、式として書けるpython 三項演算子を使って条件分岐を表現します。基本形は次のとおりです。

# 条件に応じて返す値を切り替える
f = lambda x: "OK" if x >= 0 else "NG"

print(f(10))   # OK
print(f(-3))   # NG

このパターンが特に活きるのは、「値を返すだけ」の軽い分岐です。例えば、並び替え(キー関数)や簡単な変換で、入力に応じて結果を変えたいときに役立ちます。

# 例:負数は0に丸める(簡易クランプ)
clamp0 = lambda n: n if n >= 0 else 0

また、返す内容が関数呼び出しになるケースでも、分岐自体がシンプルなら読みやすさを保てます。

# 例:文字列が空ならプレースホルダを返す
normalize = lambda s: s.strip() if s else "(empty)"

一方で、ラムダ式に三項演算子を入れるときは「短く書ける」ことがメリットである反面、次のような書き方は可読性が下がりやすい点に注意が必要です。

  • 条件が長い(比較や論理演算が多い)
  • 返す式が長い(文字列加工やネストした呼び出しが多い)
  • 三項演算子のネストで分岐が増える

ラムダ+三項演算子は「1行で完結して意味が追える」範囲に留めるのがコツです。

関数化して見通しを良くする判断基準

ラムダ式に三項演算子を詰め込みすぎると、短いのに理解しづらいコードになりやすいです。次のような状況では、無理にラムダで完結させず、defで名前付き関数にして見通しを良くするのが有効です。

  • 分岐の意図を名前で説明したい(関数名がドキュメントになる)
  • 条件や返す処理が長いため、1行に収めると追いづらい
  • 後から仕様変更が入りそうで、拡張しやすい形にしたい
  • 同じ分岐ロジックを複数箇所で再利用する

例えば、ラムダだと「何を判定しているのか」が埋もれやすいケースでも、関数化すると読み手が理解しやすくなります。

# ラムダ+三項演算子で書けるが、意図が見えにくい例
label = lambda x: "adult" if x >= 18 else "minor"

# 関数化すると「何の判定か」が明確
def age_label(age: int) -> str:
    return "adult" if age >= 18 else "minor"

さらに、条件や処理が少しでも増えそうな場合は、関数化しておくと改修がスムーズです。ラムダは「その場で一度だけ使う小さな式」、関数は「意味を持ったロジックとして育つ可能性があるもの」という基準で使い分けると、python 三項演算子を使ったコードでも読みやすさを維持しやすくなります。

仕様として押さえる:Pythonの「条件式」と演算子優先順位

python+conditional+expression

python 三項演算子(条件式)は「if文を短く書くテクニック」として語られがちですが、実務では“仕様としてどう評価されるか”を理解しているかどうかで、バグや誤読のリスクが大きく変わります。ここでは、条件式が「文」ではなく「式」である点、比較・ブール演算と組み合わせる際の書き方、そして演算子優先順位と括弧の付け方の要点を整理します。

条件式(Conditional Expressions)の位置づけ(式として扱われる)

Pythonの三項演算子は、正式には Conditional Expression(条件式) と呼ばれ、値を返す「式」です。つまり、条件に応じて評価結果(値)が決まり、その値がそのまま式の一部として扱われます。

「式」であることの重要ポイントは次の通りです。

  • 評価結果が必ず1つの値になる(条件が真ならA、偽ならB)
  • 式として他の式の中に埋め込める(関数引数、f-string、演算の一部など)
  • 分岐の“実行”ではなく“値の選択”が目的になる(どちらの値を返すか)

基本形は次の通りです(ここでは仕様の位置づけとして示すに留めます)。

value = A if condition else B

また、条件式は短絡的に評価されます。つまり、condition が真なら A だけが評価され、偽なら B だけが評価されます。両方が同時に評価されるわけではありません。

比較演算・ブール演算と組み合わせた条件の書き方

python 三項演算子の条件部分(condition)には、比較演算子(==, <, >= など)や、ブール演算子(and, or, not)を組み合わせた複合条件を置けます。複合条件を使う場合は、「何を判定している条件なのか」が一目で追える書き方を意識します。

代表的なパターンです。

  • 比較+and/orで条件をまとめる
  • 範囲判定(連鎖比較)を活用する
  • notで否定条件を明示する(ただし二重否定は避ける)
# 比較演算+and
label = "adult" if age >= 18 and country == "JP" else "minor"

# 連鎖比較(範囲)
grade = "pass" if 60 <= score <= 100 else "fail"

# not を使った否定条件
status = "disabled" if not is_active else "enabled"

複合条件は便利ですが、条件が長くなってくると読み手が「どこが判定の核なのか」を見失いやすくなります。条件部分だけでも括弧でグルーピングして、意図を見える化するのが有効です。

msg = "OK" if (is_ready and (count > 0 or force)) else "NG"

演算子の優先順位と括弧の付け方(誤解を防ぐ)

条件式を安全に使ううえで重要なのが、演算子優先順位です。Pythonでは演算子ごとに結合の強さが決まっており、括弧がないと想定外の解釈になることがあります。特に、条件式(A if condition else B)は他の演算子と混ざると読みにくくなりやすいため、「迷ったら括弧」が基本方針になります。

誤解が起きやすい典型は、条件式の結果をさらに演算に使うケースです。条件式がどこまでを返すのかを明確にするため、条件式全体を括弧で囲むと意図が固定されます。

# 条件式の結果を加算に使う:括弧で意図を固定
total = base + (bonus if has_bonus else 0)

# 文字列結合でも同様
text = prefix + ("A" if flag else "B") + suffix

また、and/or を条件式の外側に混ぜると、優先順位と可読性の両面で事故が起きやすくなります。例えば次のような形は、一見「条件式のどちらかにorがかかっている」ように見えて、読み手が迷います。

# 読み手が解釈に迷いやすい(括弧で明示したい)
result = "A" if cond else "B" or "C"

この場合、意図によって括弧の付け方が変わります。たとえば「偽側の結果が空ならCにしたい」のか、「条件式全体が空ならCにしたい」のかで意味が変わるため、必ず括弧で範囲を固定します。

# 例1:偽側だけに or を効かせたい
result = "A" if cond else ("B" or "C")

# 例2:条件式の結果全体に or を効かせたい
result = ("A" if cond else "B") or "C"

まとめると、python 三項演算子は「式」であるがゆえに他の演算子と自然に合成できますが、その分、優先順位で意図が伝わりにくい場面が出ます。条件式を他の演算と組み合わせるときは、条件式全体(または条件部分)を括弧で囲んで境界を明示するのが、誤解を防ぐ最も堅実な方法です。

よくある落とし穴とベストプラクティス

python+ternary+operator

python 三項演算子(条件式)は、コードを短くできる一方で「読み間違い」や「意図しない挙動」を招きやすいポイントもあります。ここでは、実務で遭遇しがちな落とし穴を避けつつ、安全に使うためのベストプラクティスを整理します。

真偽値判定(truthy/falsy)での意図しない分岐

Pythonでは、if x のような条件は「x が真(truthy)か偽(falsy)か」で評価されます。python 三項演算子でも同じように条件式が評価されるため、値の種類によっては意図しない分岐になることがあります。

代表的なfalsyは、00.0""(空文字)、[](空リスト)、{}(空dict)、set()(空集合)、None などです。

# 0を「有効な値」として扱いたいのに、falsy扱いで置き換わってしまう例
x = 0
result = x if x else 10
# 期待: 0 / 実際: 10

このように「値が存在するか」ではなく「0や空文字を含めて有効な値か」を判定したい場合は、truthy/falsyに頼らず、意図を明示する条件にします。

  • None かどうかだけを見たいなら is not None を使う
  • 空文字を許容するか否か、0を許容するか否かを仕様として決め、条件に反映する
# Noneだけをデフォルトに置き換えたい(0や空文字はそのまま使いたい)
x = 0
result = x if x is not None else 10
# result は 0 になる

ベストプラクティスとしては、「truthy/falsyが便利な場面」もありますが、値のドメインに0や空文字が入る可能性があるなら、python 三項演算子でも条件を明示して誤解を防ぐのが安全です。

副作用のある式を三項演算子に入れるリスク

python 三項演算子は“式”なので、条件の真偽に応じてどちらか一方だけが評価されます(短絡的に動作します)。この性質自体は便利ですが、分岐先に「副作用のある処理(ログ出力、書き込み、状態変更、時間のかかる処理など)」を入れると、コードの意図が読み取りにくくなり、保守性が下がります。

# 例:副作用(出力)を条件式に混ぜると、意図が伝わりにくい
msg = print("OK") if success else print("NG")

上記は動作としては成立しますが、「変数msgに何が入るのか」「ここでprintをしてよいのか」が読み手に伝わりづらく、レビューでも指摘されやすい書き方です。特に、以下のようなリスクが増えます。

  • 三項演算子が“値を返す”用途なのか、“処理を実行する”用途なのかが曖昧になる
  • 例外が起きたときの原因箇所が追いづらい(1行に責務が混ざる)
  • デバッグ時にブレークポイントを置きにくい
  • 処理が重い場合、どちらが実行されるか見落として性能問題につながる

ベストプラクティスは、「三項演算子は原則として“値の選択”に使い、副作用はif文へ寄せる」ことです。どうしても式として必要なら、副作用を持たない関数(純粋関数)に寄せる、または先に必要な値を計算してから選ぶ、といった形で読みやすさを優先します。

可読性を損なわないためのスタイル指針(複雑ならif文へ)

python 三項演算子は短く書ける反面、条件が長い・分岐結果が複雑・ネストが入ると一気に読みにくくなります。可読性を守るための指針を持っておくと、チーム開発でも安全に運用できます。

  • 条件・真側・偽側のどれかが長くなるなら、1行に詰めずにif文を選ぶ
  • 1行に収める場合でも、意味のある名前の変数を使い「何を判定しているか」を明確にする
  • ネストさせない(入れ子にしない)。読み手が括弧や優先順位を追う必要が出たらif文へ
  • 副作用を持つ処理や例外が起こり得る処理を分岐結果に置かない(置くならif文)

また、読みやすさの観点では「この1行を見たとき、誰が見ても同じ解釈になるか」を基準にします。三項演算子で表現できても、読解に数秒かかる時点でメリットよりデメリットが勝つことが多いです。

# 「短いから良い」ではなく、「一目で意図が分かる」かを優先する
label = "enabled" if is_enabled else "disabled"

結論として、python 三項演算子は“短くできるから使う”のではなく、“短くしても明確さが保てるときだけ使う”のがベストプラクティスです。複雑さの兆候が見えたら、迷わずif文に切り替える判断が、結果的に保守性と品質を高めます。

具体例で理解する:実務で使える三項演算子の例

python+ternary+operator

Pythonの三項演算子(条件式)は、条件によって値を出し分けたい場面で「短く」「意図を保ったまま」書けるのが強みです。ここでは、実務で遭遇しやすいケースに絞って、python 三項演算子の具体的な使い方を紹介します。

文字列・表示メッセージの出し分け

ユーザー向けの表示メッセージやログ文言は、「状態に応じて文言を変える」ことが頻繁にあります。if文でも書けますが、代入する文字列が短い場合は三項演算子のほうが読みやすくなることがあります。

# 例:ログイン状態に応じて表示メッセージを変更
is_logged_in = True
message = "ようこそ!" if is_logged_in else "ログインしてください"
print(message)

また、ステータスやフラグに応じたラベル付けにも向きます。

# 例:APIレスポンスのステータス表示を出し分け
status_code = 200
status_text = "OK" if status_code == 200 else "ERROR"

ポイントは、文言が長くなりすぎると一気に読みにくくなることです。表示する文字列が複雑な場合は、三項演算子に押し込めず、メッセージ生成自体を別の処理に分けるほうが保守性が上がります。

None対策(デフォルト値の設定)に使う

実務では、関数の戻り値や辞書の取得結果がNoneになり得るケースが多く、Noneのまま扱うと例外や表示崩れにつながります。python 三項演算子は「Noneならデフォルト値を入れる」という用途で直感的に書けます。

# 例:Noneならゲスト扱いにする
user_name = None
display_name = user_name if user_name is not None else "ゲスト"

辞書から取り出した値がNoneになり得る場合も同様です。

# 例:プロフィールの自己紹介が未設定(None)なら既定文を表示
profile = {"bio": None}
bio = profile["bio"] if profile["bio"] is not None else "自己紹介は未設定です"

ここで重要なのは、「Noneだけ」を判定したいのか、それとも空文字や0なども含めて“未設定扱い”にしたいのかを明確にすることです。Noneだけを対象にするなら、上記のように is not None を使うと意図がブレません。

条件に応じた関数呼び出しの切り替え

処理の流れは同じだが、条件によって呼び出す関数(またはメソッド)だけ変えたい、という場面でも三項演算子が役立ちます。例えば、データの整形方法を環境や入力種別で切り替えるケースです。

def format_for_admin(text: str) -> str:
    return f"[ADMIN] {text}"

def format_for_user(text: str) -> str:
    return text.strip()

is_admin = False
text = "  hello  "

formatter = format_for_admin if is_admin else format_for_user
result = formatter(text)

この書き方の利点は、「どちらの関数を使うか」を1行で決めた後、呼び出し自体は1回に揃えられる点です。呼び出しが二重になるのを避けられるため、引数が増えたときにも修正箇所が減ります。

もう少し小さな例として、ログ出力の有無で“実行する関数”を切り替えることもできます。

def do_heavy_task():
    return "done"

def do_heavy_task_with_log():
    print("start heavy task")
    return "done"

enable_log = True
task = do_heavy_task_with_log if enable_log else do_heavy_task
out = task()

条件によって処理の中身が大きく変わる場合は、三項演算子で無理にまとめず、処理自体を分けるほうが読み手に優しいこともあります。一方で「関数の選択」レベルであれば、三項演算子は実務的に使いやすいパターンです。