閉じる

if文を1行に置き換える三項演算子の使い方(Python)

Pythonの三項演算子(条件演算子)は、条件によって値を切り替える処理を1行で簡潔に書ける構文です。

冗長なif文を減らし、読みやすさとスピードの両方を高めます。

本記事では基本構文、使い方、置き換えのコツ、注意点を、Python初心者の方にも分かりやすいサンプルとともに丁寧に解説します。

三項演算子(条件演算子)とは?Pythonでif文を1行にする基本

構文(x if 条件 else y)の意味

Pythonの三項演算子はx if 条件 else yと書きます。

これは「条件」がTrueならx、Falseならyを返す式です。

式なので代入の右辺、関数の返り値、f-stringの中など、さまざまな場所で使えます。

以下は年齢によって表示ラベルを切り替える例です。

Python
# 三項演算子の基本: 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相当)と判定されます。

次の例で挙動を確認します。

Python
# 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行で書く

条件によって代入する値を切り替える場合、三項演算子が最も読みやすい場面のひとつです。

Python
# 会員なら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
Python
# 合格/不合格を1行で決める
score = 58
result = "合格" if score >= 60 else "不合格"
print(f"score={score} -> {result}")
実行結果
score=58 -> 不合格

returnを1行で書く

関数の返り値が2択で決まる場合、returnの右辺にそのまま書けます。

Python
# 送料の簡易ルール:
# - プレミアム会員 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回表示に限定するのがおすすめです。

Python
# 体温でメッセージを分岐
temps = [36.2, 38.1]

for t in temps:
    print("発熱の疑いあり") if t >= 37.5 else print("平熱")
実行結果
平熱
発熱の疑いあり

if文から三項演算子への置き換え方

before/afterで書き換えを理解する

「変数に代入する値が2択」の典型パターンは、if文を安全に1行へ置き換えられます。

Python
# Before: if/elseで代入
score = 72
if score >= 60:
    result = "Pass"
else:
    result = "Fail"
print(result)
実行結果
Pass
Python
# After: 三項演算子で1行
score = 72
result = "Pass" if score >= 60 else "Fail"
print(result)
実行結果
Pass

同じ処理は1カ所にまとめる

if/elseの両側に同じ処理がある場合、違いだけを三項演算子で表すと読みやすくなります。

Python
# 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円)
Python
# 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を省略する記法はありません

Python
# これはSyntaxError(例としてコメントアウト)
# value = "yes" if condition

# 正しい書き方
condition = True
value = "yes" if condition else "no"
print(value)
実行結果
yes

ネストは避ける(読みづらくなる)

ネスト自体は可能ですが、読みづらくなります。

複雑になりそうならif-elif-elseに戻すのが無難です。

Python
# ネストした三項演算子(動くが読みにくい)
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
Python
# 可読性重視の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

優先順位が不安なときは括弧()で明確にする

演算子の優先順位に依存すると誤読の原因になります。

括弧で意図をはっきり書きましょう。

Python
# これは意図がズレやすい例:
# 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言語
// C/JavaScript系の例
// 条件 ? 値_if_true : 値_if_false
int x = isAdult ? 1 : 0;
Python
# 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や空文字など)だと意図と違う値になります。

Python
# 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の代用は誤動作を招く点にも注意してください。

小さな分岐をシンプルに保てば、コードは読みやすく、修正にも強くなります。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!