Pythonの三項演算子(条件式)は、「短く書ける」便利さと「読みづらくなりやすい」危険性の両方を持つ構文です。
この記事では、Pythonの三項演算子の基本から、if文との使い分け、安全に使うための注意点、実用的なサンプルコードまでを体系的に解説します。
初心者の方でも理解しやすいように、図解や具体例を交えながら、一行ifの書き方を丁寧に紹介していきます。
Pythonの三項演算子とは
三項演算子(条件式)の基本構文
Pythonの三項演算子は、条件によって値を切り替えるための「条件付き式」です。
まずは、Pythonにおける三項演算子の基本構文を確認します。

Pythonの三項演算子(条件式)は、次のような形で書きます。
基本構文:
結果 = 真のときの値 if 条件式 else 偽のときの値
この構文は、次のような意味になります。
- 条件式 が True のとき
→真のときの値が評価され、その結果が結果に代入されます。 - 条件式 が False のとき
→偽のときの値が評価され、その結果が結果に代入されます。
簡単な例
age = 20
# 三項演算子でメッセージを切り替える
message = "成人です" if age >= 18 else "未成年です"
print(message)
成人です
この例では、age >= 18 が True なので、"成人です" が選ばれています。
ここで重要なのは、Pythonの三項演算子は「式(expression)」であり、「文(statement)」ではないという点です。
つまり、if 文と違って「値を返す」ため、式が書ける場所(代入の右辺、関数の引数、内包表記の中など)で使える、という特徴があります。
if文との違いと使い分け

同じロジックを、通常のif文と三項演算子で書き比べてみます。
if文で書く場合
age = 20
if age >= 18:
message = "成人です"
else:
message = "未成年です"
print(message)
三項演算子で書く場合
age = 20
message = "成人です" if age >= 18 else "未成年です"
print(message)
どちらも同じ結果になりますが、構造的な違いがあります。
- if文
- 文(statement)です。
- 複数行にわたって処理を記述でき、代入以外の処理(関数呼び出しなど)も自由に書けます。
- 三項演算子
- 式(expression)です。
「1つの値を選んで返す」用途に向いています。- 処理というより「値の切り替え」として考えると分かりやすくなります。
実務では、「値を1つ選ぶだけ」の単純な分岐は三項演算子、「複数行の処理」や「状態変更を行う」分岐はif文というように使い分けるのが安全です。
三項演算子の書き方
シンプルな三項演算子の例
まずは、読みやすく、問題が起きづらいシンプルな使い方から見ていきます。

メッセージの切り替え
score = 75
# 合否判定を三項演算子で表現
result = "合格" if score >= 60 else "不合格"
print(result)
合格
数値の切り替え
x = -3
# 絶対値を三項演算子で実装
abs_x = -x if x < 0 else x
print(abs_x)
3
関数の引数に使う例
def greet(is_formal):
# 三項演算子であいさつ文を切り替える
message = "こんにちは" if is_formal else "やあ"
print(message)
greet(True)
greet(False)
こんにちは
やあ
このように、「1つの変数に代入する値を、条件で一度だけ切り替える」という形は、三項演算子が最も得意とするパターンです。
ネストした三項演算子の書き方と注意
三項演算子は、さらに中に三項演算子を埋め込んでネストすることもできます。
しかし、可読性を大きく損ないやすいので注意が必要です。

ネストした三項演算子の例
点数に応じて評価を変える処理を例にします。
score = 85
# ネストした三項演算子による評価
grade = (
"A" if score >= 80 else
"B" if score >= 70 else
"C" if score >= 60 else
"D"
)
print(grade)
A
このコードは一応読み取ることができますが、かっこを省略したり、改行を詰めたりすると急激に読みにくくなります。
悪い例:
grade = "A" if score >= 80 else "B" if score >= 70 else "C" if score >= 60 else "D"
このように書くと、どのelseがどのifに対応しているのかが一目で分かりにくくなります。
if/elif/elseで書き直した例
同じ処理を、通常のif文で書くと次のようになります。
score = 85
if score >= 80:
grade = "A"
elif score >= 70:
grade = "B"
elif score >= 60:
grade = "C"
else:
grade = "D"
print(grade)
ネストした三項演算子よりも、条件の優先順位が明確で、保守しやすいことが分かります。
そのため、三項演算子のネストは、2段程度までにとどめるか、できるだけ避けるというのが実務的なガイドラインになります。
三項演算子と論理演算子(and, or)の比較
Pythonでは、簡単な条件付き値の切り替えにandやorを使うテクニックも存在します。
ただし、意味や挙動が異なるため、三項演算子の代用品として安易に使うのは危険です。

and/or を三項演算子風に使う書き方
一部のコードでは、次のような書き方を見かけることがあります。
flag = True
value = flag and "ON" or "OFF"
print(value)
ON
条件がTrueのときは"ON"、Falseのときは"OFF"になっているように見えます。
しかし、この書き方には落とし穴があります。
三項演算子との決定的な違い
次の例で違いを確認してみます。
flag = True
# and/or で条件付き代入
value1 = flag and "" or "default"
# 三項演算子で条件付き代入
value2 = "" if flag else "default"
print("and/or:", repr(value1))
print("三項演算子:", repr(value2))
and/or: 'default'
三項演算子: ''
三項演算子では想定通り""が選ばれるのに対し、and/or では"default"が選ばれてしまっています。
これは、andやorが「真偽値として偽とみなされる値」(空文字、0、空リスト、None など)を特別扱いするためです。
その結果、「条件がTrueでも、値が偽っぽいときに意図しない切り替えが起きる」というバグが発生します。
そのため、「条件に応じて2つの値のどちらかを選ぶ」目的には、三項演算子を使うべきであり、and/orで代用するのは避けることをおすすめします。
三項演算子を安全に使うための注意点
可読性を損なう三項演算子のNG例
三項演算子は短く書ける反面、「短い = 読みやすい」ではないという点に注意が必要です。
特に、次のような書き方は避けた方が良いです。

1行に詰め込みすぎる例
# 悪い例: 条件も処理も長すぎて読みにくい
discount = price * 0.8 if user.is_premium_member() and price > 10000 and not user.is_blacklisted() else price
このような書き方では、「どこまでが条件で、どこからが値なのか」を読み取るのが大変です。
改善案として、条件式や値を一旦変数に分けることで、人間にとって読みやすいコードにできます。
is_discount_target = (
user.is_premium_member()
and price > 10000
and not user.is_blacklisted()
)
discount_price = price * 0.8
discount = discount_price if is_discount_target else price
このように、「意味のある塊」で一度変数に分けてから三項演算子を使うと、可読性がぐっと上がります。
三項演算子の副作用とバグの原因
三項演算子は「値を返す式」なので、本来は副作用(値以外の状態変化)を持たないように使うのが理想です。
しかし、無理に処理を詰め込むと、予期せぬバグの原因になります。

副作用を含む危険な例
items = []
# 悪い例: 三項演算子の中でリスト操作を行っている
result = items.append("A") if condition else items.append("B")
問題点:
appendの戻り値は None なので、resultには常に None が入ります。- 三項演算子で「値を選びたい」のか「副作用を起こしたい」のかが不明瞭です。
このような場合は、素直にif文で書いた方が安全です。
items = []
if condition:
items.append("A")
else:
items.append("B")
「何かを変更する処理(副作用)」と「値を返す処理」は分ける、という基本原則を守ることで、三項演算子によるバグを防ぎやすくなります。
if文と三項演算子を選ぶ基準
では、実務でコードを書く際に、どのような基準でif文と三項演算子を使い分ければよいかを整理します。

次のような観点で判断するとよいです。
- 「1つの値を選ぶだけ」かどうか
- Yes → 三項演算子を検討
- No → if文を使う
- 処理が1行で直感的に読めるか
- Yes → 三項演算子でもOK
- No → if文にして構造をはっきりさせる
- 副作用(ログ出力、リスト操作など)を含んでいないか
- 含んでいる → if文の方が安全
- 将来、条件が増える可能性が高いか
- 高い → 拡張しやすいif/elif/elseにしておく
要するに、「短く書くこと」よりも「未来の自分や他人が読めること」を優先し、三項演算子は「シンプルな値切り替え専用の道具」として使うのが、安全なスタイルです。
実践的な三項演算子の活用例
デフォルト値の設定に三項演算子を使う
現場でよくあるパターンとして、「None や空文字だったら、デフォルト値を使いたい」というケースがあります。
三項演算子はこのような場面でよく使われます。

None のときにデフォルト名を使う
name_from_db = None
# None のときは "ゲスト" を使う
display_name = name_from_db if name_from_db is not None else "ゲスト"
print(display_name)
ゲスト
このように、「条件がシンプルで、代入する値もシンプル」な場合には、三項演算子で非常に分かりやすく書けます。
空文字をデフォルトに置き換える例
input_name = ""
# 空文字ならデフォルト表示名に置き換える
display_name = input_name if input_name != "" else "名称未設定"
print(display_name)
名称未設定
なお、単純に「偽っぽい値ならデフォルト」という意味でよい場合は、Pythonではorを使って次のように書くこともできます。
input_name = ""
display_name = input_name or "名称未設定"
print(display_name)
名称未設定
ただし、この場合は0や[]なども「偽」と判定されることを理解した上で使う必要があります。
「None のときだけデフォルト」など、意味を厳密にしたい場合は三項演算子の方が明確です。
リスト内包表記と三項演算子の組み合わせ
リスト内包表記と三項演算子は、相性のよい組み合わせです。
各要素ごとに条件付きで値を変換したい場合などに、よく使われます。

偶数・奇数をラベル文字列に変換する例
numbers = [1, 2, 3, 4, 5]
# 各要素が偶数か奇数かでラベルを切り替える
labels = ["偶数" if n % 2 == 0 else "奇数" for n in numbers]
print(labels)
['奇数', '偶数', '奇数', '偶数', '奇数']
このように、「1つの要素に対して1つの値を選ぶ」というパターンでは、三項演算子を組み合わせることで非常にコンパクトかつ読みやすいコードになります。
None を 0 に置き換える変換
values = [10, None, 5, None, 0]
# None は 0 に置き換える
normalized = [v if v is not None else 0 for v in values]
print(normalized)
[10, 0, 5, 0, 0]
ここでも、条件は短く、選ぶ値も短いという形になっているため、三項演算子が自然に読める範囲に収まっています。
関数内での条件分岐を一行で書く方法
最後に、関数の戻り値を条件で切り替える実践的な例を見てみます。
関数の中で「返す値だけを変えたい」場合は、三項演算子を使うと非常にスッキリします。

割引率を返す関数の例
def get_discount_rate(is_member):
# 会員なら10%、そうでなければ0%を返す
return 0.1 if is_member else 0.0
print(get_discount_rate(True))
print(get_discount_rate(False))
0.1
0.0
このように、関数の戻り値を条件だけで切り替える場合は、return 文と三項演算子の組み合わせがとても読みやすいです。
ログインメッセージを返す例
def get_login_message(user):
# user が None ならゲスト扱いにする
return f"{user.name}さん、ようこそ" if user is not None else "ゲストさん、ようこそ"
# サンプル用の簡単なクラスを定義
class User:
def __init__(self, name):
self.name = name
user = User("田中")
print(get_login_message(user))
print(get_login_message(None))
田中さん、ようこそ
ゲストさん、ようこそ
このような「戻り値の切り替えだけで完結する関数」は、三項演算子との相性がよく、コードも自然に読めます。
まとめ
Pythonの三項演算子は、「真のときの値 if 条件式 else 偽のときの値」という独特の構文を持つ、条件付きの式です。
1つの値を条件で選びたいだけの場合には、if文よりもコンパクトに表現でき、代入やreturn、内包表記の中などで特に威力を発揮します。
一方で、ネストしすぎたり、副作用を含めたり、and/orで代用しようとすると、可読性低下や思わぬバグの原因となります。
「値を1つ選ぶシンプルな場面だけに使う」「読んだ瞬間に意味が分かる長さにとどめる」というルールを守れば、三項演算子はif文と並ぶ強力で安全な道具として、日常的なPythonコーディングをより快適にしてくれます。
