三項演算子
このレッスンで分かること
- 三項演算子は
value_if_true if condition else value_if_falseの語順で 1 行の二択を書きます- 値を返す「式」なので代入や
returnの右辺に直接書けます- 最小例は
def even_or_odd(n): return "even" if n % 2 == 0 else "odd"
三項演算子 とは
a if cond else bで条件によって値を切り替えます。本レッスンでは、三項演算子 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
三項演算子で 1 行の分岐を書く
三項演算子は、条件によって 2 つの値のうちどちらか一方を選ぶための簡潔な書き方です。Python では value_if_true if condition else value_if_false という英文ライクな構文になっており、他の言語の cond ? a : b とは順番が違うのが特徴です。短い条件分岐をシンプルに 1 行で書きたいときに便利で、変数の初期化や return 文との相性が抜群です。
通常の if 文は「文」として副作用 (代入やプリント) を伴うのに対し、三項演算子は「式」として 1 つの値を返します。そのため、result = x if x > 0 else -x のように代入の右辺に直接書けたり、リスト内包表記の中で使えたりと、可読性を保ったまま行数を減らせる場面で重宝します。
三項演算子は短い分岐専用です。条件が複雑になったら通常の
if文に切り替えるのが鉄則です。
三項演算子は Python だけでなく多くの言語に存在しますが、語順は言語ごとに異なります。Python の a if cond else b という語順は読み下しやすい一方で、他言語経験者は最初戸惑うことが多いポイントです。慣れるまでは「条件が真なら左、偽なら右」と頭の中で唱えながら書くとミスが減ります。
| 言語 | 三項演算子の語順 | 例 |
|---|---|---|
| Python | a if cond else b | x if x > 0 else -x |
| JavaScript / C / Java | cond ? a : b | x > 0 ? x : -x |
| Ruby | cond ? a : b | x > 0 ? x : -x |
| Kotlin | if (cond) a else b (式) | if (x > 0) x else -x |
基本の文法と動き
Python の三項演算子は、真ん中に if を置く独特の語順です。読み下すと「条件が真なら左の値、偽なら右の値」となります。たとえば絶対値を求める処理を 1 行で書くと次のようになります。if 文で書いた場合の 4 行が、三項演算子なら 1 行で済むのがよく分かります。
Python
x = -5
abs_x = x if x >= 0 else -x
print(abs_x) # 5
label = "偶数" if x % 2 == 0 else "奇数"
print(label) # 奇数比較のために if 文版も書いてみます。同じ動きですが、行数とインデントの量が違います。
Python
if x >= 0:
abs_x = x
else:
abs_x = -x三項演算子は値を返すため、return と組み合わせるとさらに簡潔になります。def sign(x): return 1 if x > 0 else -1 のように書けば、if 文の分岐を 1 行で表現できます。リスト内包表記の中で使うのも定番で、[n if n > 0 else 0 for n in nums] のようにマイナスを 0 に置き換える処理が 1 行で書けます。
評価の流れを箇条書きで言い換えると、次のとおりです。
- 真ん中の
condを先に評価 - 真なら左の
a(=value_if_true) を結果として返す - 偽なら右の
b(=value_if_false) を結果として返す - 結果は「式」なので代入や
returnの右辺に置ける
a if cond else bの語順は「結論を先に、理由を後に」述べる構文です。英作文のように読むと自然です。
ネストして使うときの注意
三項演算子は入れ子にすることもできますが、可読性が一気に落ちます。たとえば 3 段階のラベル付けを三項演算子で書くと次のようになります。括弧 ( ) で意図を明示するのがコツです。
Python
x = 0
label = "正" if x > 0 else ("負" if x < 0 else "ゼロ")
print(label) # ゼロこの程度ならまだ読めますが、4 段階以上になると if-elif-else のほうが圧倒的に読みやすくなります。三項演算子は「条件が 1 つの単純な二択」のときに使うのが鉄則です。可読性を犠牲にしてまで短く書く必要はありません。チーム開発では、入れ子の三項演算子はレビューで NG が出ることもあります。
入れ子の三項演算子は「書ける」ことと「書くべき」ことが別物の典型例です。可読性を優先しましょう。
よくある間違い
三項演算子でつまずきやすいのは次の 3 点です。1 つめは語順を間違えて if cond a else b のように書いてしまうケースで、これは構文エラーになります。2 つめは print("OK") if ok else print("NG") のように副作用つきの文を埋め込むケースで、動きはしますが式としての設計意図に反します。3 つめは、elif を使いたいのに無理やり三項演算子をネストして可読性を下げてしまうケースです。
Python
# NG (構文エラー)
# value = if x > 0 "plus" else "minus"
# OK (語順は value if cond else other)
value = "plus" if x > 0 else "minus"「短いほうが偉い」わけではありません。可読性が落ちるなら
if文を使うのが正解です。
ここまでの要点
三項演算子は a if cond else b の語順、値を返す「式」。短い二択向け、ネストは避けて if-elif-else に切り替えるのが定石。
やってみよう
今回の課題は、整数 n を受け取り、n が偶数なら文字列 "even"、奇数なら "odd" を返す関数 even_or_odd(n) を三項演算子で書くことです。手順は次のとおりです。
def even_or_odd(n):で関数を定義する"even" if n % 2 == 0 else "odd"をreturnする- 偶数 / 奇数 / 負数 / 0 でテストが pass するか確認する
書けたら、if-else 文で書いた版と比べてみて、どちらが読みやすいか自分の感覚で判断してみてください。三項演算子はあくまで道具のひとつなので、状況に応じて使い分けるのが上達のコツです。応用として、max や min を三項演算子で書き換えてみるのも良い練習になります。たとえば 2 つの数の最大値は a if a > b else b で表せます。
よくある質問
Q. 三項演算子はいつ使うべきですか?
A. 値を 1 行で決めたいときに有効です。たとえば label = '成人' if age >= 20 else '未成年' のような短い条件分岐は読みやすくなります。ネストすると一気に読みにくくなるので、条件が 3 つ以上に増えたら if-elif-else に切り替えましょう。
Q. if 文と三項演算子はどっちが速いですか?
A. 実行速度はほぼ同じです。三項演算子は式(値を返す)、if 文は文(処理を行う)という違いだけです。可読性で選び、副作用のある処理(print、API 呼び出し)は if 文側に書き、純粋な値の選択だけ三項にするのが綺麗です。
Q. 三項演算子で複数の条件を扱えますか?
A. a if cond1 else (b if cond2 else c) と書けますが読みにくくなりがちです。3 段以上は match 文や辞書ルックアップ(grade_label[score])に置き換えた方が拡張も楽です。条件が増えるたびに括弧が増えてレビューで指摘されることが多いポイントです。
次のレッスン
次は in 演算子 で、a if cond else b で条件によって値を切り替えます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 三項演算子 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 三項演算子 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 三項演算子を使って 1 行で書く
- 偶数なら 'even'、奇数なら 'odd' を返す
- if 文の複数行で書かない
入出力例
test-cases.txt
even_or_odd(2) → "even"
even_or_odd(3) → "odd"
even_or_odd(0) → "even"
even_or_odd(-4) → "even"
even_or_odd(-5) → "odd"