Pythonの三項演算子(条件演算子)は、条件によって値を切り替える処理を1行で簡潔に書ける構文です。
冗長なif文を減らし、読みやすさとスピードの両方を高めます。
本記事では基本構文、使い方、置き換えのコツ、注意点を、Python初心者の方にも分かりやすいサンプルとともに丁寧に解説します。
三項演算子(条件演算子)とは?Pythonでif文を1行にする基本
構文(x if 条件 else y)の意味
Pythonの三項演算子はx if 条件 else y
と書きます。
これは「条件」がTrueならx、Falseならyを返す式です。
式なので代入の右辺、関数の返り値、f-stringの中など、さまざまな場所で使えます。
以下は年齢によって表示ラベルを切り替える例です。
# 三項演算子の基本: x if 条件 else y
ages = [25, 16]
for age in ages:
# 20歳以上なら"adult"、それ以外なら"minor"
label = "adult" if age >= 20 else "minor"
print(f"age={age} -> {label}")
age=25 -> adult
age=16 -> minor
if文との違いとメリット
三項演算子は式、if文は文です。
式は値を返せるため、代入やreturnの右辺にそのまま書けます。
メリットは次の通りです。
冗長な分岐を1行にまとめ、意図が「2択」だと一目で伝わる点が大きいです。
また、条件に応じた片側だけが評価されるため、不要な計算を避けられます(遅延評価)。
表で違いを整理します。
観点 | if文 | 三項演算子 |
---|---|---|
位置づけ | 文(statement) | 式(expression) |
値の返却 | 直接は返さない | 値を返す |
行数 | 複数行になりがち | 1行で書ける |
向き不向き | 複雑な分岐に強い | 2択の単純分岐に最適 |
評価 | then/else両方に処理を書ける | 片側のみ評価(不要計算を回避) |
条件はTrue/Falseに評価される
三項演算子の条件
部分はTrue/Falseに評価される任意の式です。
Pythonでは空文字や0、空のリスト、Noneなどは偽(= False相当)と判定されます。
次の例で挙動を確認します。
# Truthy/Falsyな値で三項演算子を使う例
samples = ["", "hi", [], [1], 0, 3.14, None, "0"]
for v in samples:
# vが空/ゼロ/Noneなら"Falsy"、それ以外は"Truthy"
kind = "Falsy" if not v else "Truthy"
print(f"value={repr(v):>6} -> {kind}")
value='' -> Falsy
value='hi' -> Truthy
value=[] -> Falsy
value=[1] -> Truthy
value=0 -> Falsy
value=3.14 -> Truthy
value=None -> Falsy
value='0' -> Truthy
三項演算子の使い方と書き方(初心者向けサンプル)
変数代入を1行で書く
条件によって代入する値を切り替える場合、三項演算子が最も読みやすい場面のひとつです。
# 会員なら10%割引、そうでなければ割引なし
base_price = 1200
is_member = True
discount_rate = 0.1 if is_member else 0.0
final_price = int(base_price * (1 - discount_rate))
print(f"member={is_member} -> final_price={final_price}")
member=True -> final_price=1080
# 合格/不合格を1行で決める
score = 58
result = "合格" if score >= 60 else "不合格"
print(f"score={score} -> {result}")
score=58 -> 不合格
returnを1行で書く
関数の返り値が2択で決まる場合、returnの右辺にそのまま書けます。
# 送料の簡易ルール:
# - プレミアム会員 or 5000円以上なら0円
# - それ以外は500円
def shipping_fee(price: int, is_premium: bool) -> int:
return 0 if (is_premium or price >= 5000) else 500
print(shipping_fee(6000, False)) # 5000円以上 -> 0
print(shipping_fee(3000, True)) # 会員 -> 0
print(shipping_fee(3000, False)) # 条件外 -> 500
0
0
500
printの表示を条件で切り替える
表示だけを切り替える用途でも書けます。
とはいえ、副作用(printなど)のために使い過ぎると読みづらくなるので、短い1回表示に限定するのがおすすめです。
# 体温でメッセージを分岐
temps = [36.2, 38.1]
for t in temps:
print("発熱の疑いあり") if t >= 37.5 else print("平熱")
平熱
発熱の疑いあり
if文から三項演算子への置き換え方
before/afterで書き換えを理解する
「変数に代入する値が2択」の典型パターンは、if文を安全に1行へ置き換えられます。
# Before: if/elseで代入
score = 72
if score >= 60:
result = "Pass"
else:
result = "Fail"
print(result)
Pass
# After: 三項演算子で1行
score = 72
result = "Pass" if score >= 60 else "Fail"
print(result)
Pass
同じ処理は1カ所にまとめる
if/elseの両側に同じ処理がある場合、違いだけを三項演算子で表すと読みやすくなります。
# Before: 共通のprintが両側に重複している
base = 1000
is_member = False
if is_member:
price = int(base * 0.9)
print(f"請求額:{price}円(送料500円)")
else:
price = base
print(f"請求額:{price}円(送料500円)")
請求額:1000円(送料500円)
# After: 違い(割引率)だけを三項演算子に
base = 1000
is_member = False
price = int(base * (0.9 if is_member else 1.0))
print(f"請求額:{price}円(送料500円)")
請求額:1000円(送料500円)
このように共通部分を1カ所にまとめることで、重複を減らし、メンテナンス性が上がります。
三項演算子の注意点とよくあるミス
elseは必須(2つの値が必要)
Pythonの三項演算子は必ず2つの値(xとy)が必要です。
elseを省略する記法はありません。
# これはSyntaxError(例としてコメントアウト)
# value = "yes" if condition
# 正しい書き方
condition = True
value = "yes" if condition else "no"
print(value)
yes
ネストは避ける(読みづらくなる)
ネスト自体は可能ですが、読みづらくなります。
複雑になりそうならif-elif-elseに戻すのが無難です。
# ネストした三項演算子(動くが読みにくい)
def grade(score: int) -> str:
return "A" if score >= 80 else ("B" if score >= 65 else ("C" if score >= 50 else "D"))
for s in [85, 70, 55, 40]:
print(s, "->", grade(s))
85 -> A
70 -> B
55 -> C
40 -> D
# 可読性重視のif-elif-else版
def grade(score: int) -> str:
if score >= 80:
return "A"
elif score >= 65:
return "B"
elif score >= 50:
return "C"
else:
return "D"
for s in [85, 70, 55, 40]:
print(s, "->", grade(s))
85 -> A
70 -> B
55 -> C
40 -> D
優先順位が不安なときは括弧()で明確にする
演算子の優先順位に依存すると誤読の原因になります。
括弧で意図をはっきり書きましょう。
# これは意図がズレやすい例:
# vipなら base + 100、そうでなければ base + 200 にしたいのに…
base = 1000
vip = False
wrong = base + 100 if vip else 200 # -> vipがFalseだと200になってしまう(1200ではない)
correct = base + (100 if vip else 200)
print("wrong =", wrong)
print("correct =", correct)
wrong = 200
correct = 1200
上のように「どこにifがかかるか」が曖昧だとバグになります。
迷ったら括弧が安全です。
C系の(?:)との記法の違いに注意
CやJavaScriptの条件 ? 真 : 偽
と、Pythonの真 if 条件 else 偽
は順序が逆です。
書き間違えに注意しましょう。
// C/JavaScript系の例
// 条件 ? 値_if_true : 値_if_false
int x = isAdult ? 1 : 0;
# Pythonの例
# 値_if_true if 条件 else 値_if_false
is_adult = True
x = 1 if is_adult else 0
print(x)
1
and/orでの代用は避ける
昔のPythonではcond and x or y
という書き方が使われましたが、危険で非推奨です。
xが偽(0や空文字など)だと意図と違う値になります。
# and/or での代用は誤動作の元
pairs = [
(True, 1), # xが1(真) -> 表面上は正しく見える
(True, 0), # xが0(偽) -> 誤動作しやすい
(True, ""), # xが空文字(偽) -> 誤動作しやすい
(False, 1), # condがFalse
]
for cond, x in pairs:
y = 99
# 三項演算子(正しい)
t = x if cond else y
# and/or代用(危険)
a = cond and x or y
print(f"cond={cond:5}, x={repr(x):>3} -> ternary={repr(t):>3}, and/or={repr(a):>3}")
cond=True, x= 1 -> ternary= 1, and/or= 1
cond=True, x= 0 -> ternary= 0, and/or= 99
cond=True, x='' -> ternary='', and/or= 99
cond=False, x= 1 -> ternary= 99, and/or= 99
常にx if cond else y
を使うのが安全です。
まとめ
三項演算子は「2択の値を選ぶ」処理を1行で端的に表現できる強力な表現です。
代入やreturnの右辺、簡単な表示切り替えなどで特に効果を発揮します。
いっぽうでネストの多用や優先順位の曖昧さは可読性を損なうため、括弧で明確化し、複雑になったらif-elif-elseへ戻すのがよい判断です。
C系の?:
とは順序が逆で、and/orの代用は誤動作を招く点にも注意してください。
小さな分岐をシンプルに保てば、コードは読みやすく、修正にも強くなります。