閉じる

【Python】三項演算子の書き方と注意点まとめ|if文を一行で安全に書く方法

Pythonの三項演算子(条件式)は、「短く書ける」便利さと「読みづらくなりやすい」危険性の両方を持つ構文です。

この記事では、Pythonの三項演算子の基本から、if文との使い分け、安全に使うための注意点、実用的なサンプルコードまでを体系的に解説します。

初心者の方でも理解しやすいように、図解や具体例を交えながら、一行ifの書き方を丁寧に紹介していきます。

Pythonの三項演算子とは

三項演算子(条件式)の基本構文

Pythonの三項演算子は、条件によって値を切り替えるための「条件付き式」です。

まずは、Pythonにおける三項演算子の基本構文を確認します。

Pythonの三項演算子(条件式)は、次のような形で書きます。

基本構文:

Python
結果 = 真のときの値 if 条件式 else 偽のときの値

この構文は、次のような意味になります。

  • 条件式 が True のとき
    真のときの値 が評価され、その結果が 結果 に代入されます。
  • 条件式 が False のとき
    偽のときの値 が評価され、その結果が 結果 に代入されます。

簡単な例

Python
age = 20

# 三項演算子でメッセージを切り替える
message = "成人です" if age >= 18 else "未成年です"

print(message)
実行結果
成人です

この例では、age >= 18 が True なので、"成人です" が選ばれています。

ここで重要なのは、Pythonの三項演算子は「式(expression)」であり、「文(statement)」ではないという点です。

つまり、if 文と違って「値を返す」ため、式が書ける場所(代入の右辺、関数の引数、内包表記の中など)で使える、という特徴があります。

if文との違いと使い分け

同じロジックを、通常のif文と三項演算子で書き比べてみます。

if文で書く場合

Python
age = 20

if age >= 18:
    message = "成人です"
else:
    message = "未成年です"

print(message)

三項演算子で書く場合

Python
age = 20

message = "成人です" if age >= 18 else "未成年です"

print(message)

どちらも同じ結果になりますが、構造的な違いがあります。

  • if文
    • 文(statement)です。
    • 複数行にわたって処理を記述でき、代入以外の処理(関数呼び出しなど)も自由に書けます。
  • 三項演算子
    • 式(expression)です。
    • 「1つの値を選んで返す」用途に向いています。
    • 処理というより「値の切り替え」として考えると分かりやすくなります。

実務では、「値を1つ選ぶだけ」の単純な分岐は三項演算子「複数行の処理」や「状態変更を行う」分岐はif文というように使い分けるのが安全です。

三項演算子の書き方

シンプルな三項演算子の例

まずは、読みやすく、問題が起きづらいシンプルな使い方から見ていきます。

メッセージの切り替え

Python
score = 75

# 合否判定を三項演算子で表現
result = "合格" if score >= 60 else "不合格"

print(result)
実行結果
合格

数値の切り替え

Python
x = -3

# 絶対値を三項演算子で実装
abs_x = -x if x < 0 else x

print(abs_x)
実行結果
3

関数の引数に使う例

Python
def greet(is_formal):
    # 三項演算子であいさつ文を切り替える
    message = "こんにちは" if is_formal else "やあ"
    print(message)

greet(True)
greet(False)
実行結果
こんにちは
やあ

このように、「1つの変数に代入する値を、条件で一度だけ切り替える」という形は、三項演算子が最も得意とするパターンです。

ネストした三項演算子の書き方と注意

三項演算子は、さらに中に三項演算子を埋め込んでネストすることもできます。

しかし、可読性を大きく損ないやすいので注意が必要です。

ネストした三項演算子の例

点数に応じて評価を変える処理を例にします。

Python
score = 85

# ネストした三項演算子による評価
grade = (
    "A" if score >= 80 else
    "B" if score >= 70 else
    "C" if score >= 60 else
    "D"
)

print(grade)
実行結果
A

このコードは一応読み取ることができますが、かっこを省略したり、改行を詰めたりすると急激に読みにくくなります

悪い例:

Python
grade = "A" if score >= 80 else "B" if score >= 70 else "C" if score >= 60 else "D"

このように書くと、どのelseがどのifに対応しているのかが一目で分かりにくくなります。

if/elif/elseで書き直した例

同じ処理を、通常のif文で書くと次のようになります。

Python
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では、簡単な条件付き値の切り替えにandorを使うテクニックも存在します。

ただし、意味や挙動が異なるため、三項演算子の代用品として安易に使うのは危険です。

and/or を三項演算子風に使う書き方

一部のコードでは、次のような書き方を見かけることがあります。

Python
flag = True
value = flag and "ON" or "OFF"
print(value)
実行結果
ON

条件がTrueのときは"ON"、Falseのときは"OFF"になっているように見えます。

しかし、この書き方には落とし穴があります。

三項演算子との決定的な違い

次の例で違いを確認してみます。

Python
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"が選ばれてしまっています。

これは、andor「真偽値として偽とみなされる値」(空文字、0、空リスト、None など)を特別扱いするためです。

その結果、「条件がTrueでも、値が偽っぽいときに意図しない切り替えが起きる」というバグが発生します。

そのため、「条件に応じて2つの値のどちらかを選ぶ」目的には、三項演算子を使うべきであり、and/orで代用するのは避けることをおすすめします。

三項演算子を安全に使うための注意点

可読性を損なう三項演算子のNG例

三項演算子は短く書ける反面、「短い = 読みやすい」ではないという点に注意が必要です。

特に、次のような書き方は避けた方が良いです。

1行に詰め込みすぎる例

Python
# 悪い例: 条件も処理も長すぎて読みにくい
discount = price * 0.8 if user.is_premium_member() and price > 10000 and not user.is_blacklisted() else price

このような書き方では、「どこまでが条件で、どこからが値なのか」を読み取るのが大変です。

改善案として、条件式や値を一旦変数に分けることで、人間にとって読みやすいコードにできます

Python
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

このように、「意味のある塊」で一度変数に分けてから三項演算子を使うと、可読性がぐっと上がります。

三項演算子の副作用とバグの原因

三項演算子は「値を返す式」なので、本来は副作用(値以外の状態変化)を持たないように使うのが理想です。

しかし、無理に処理を詰め込むと、予期せぬバグの原因になります。

副作用を含む危険な例

Python
items = []

# 悪い例: 三項演算子の中でリスト操作を行っている
result = items.append("A") if condition else items.append("B")

問題点:

  • appendの戻り値は None なので、resultには常に None が入ります。
  • 三項演算子で「値を選びたい」のか「副作用を起こしたい」のかが不明瞭です。

このような場合は、素直にif文で書いた方が安全です。

Python
items = []

if condition:
    items.append("A")
else:
    items.append("B")

「何かを変更する処理(副作用)」と「値を返す処理」は分ける、という基本原則を守ることで、三項演算子によるバグを防ぎやすくなります。

if文と三項演算子を選ぶ基準

では、実務でコードを書く際に、どのような基準でif文と三項演算子を使い分ければよいかを整理します。

次のような観点で判断するとよいです。

  1. 「1つの値を選ぶだけ」かどうか
    1. Yes → 三項演算子を検討
    2. No → if文を使う
  2. 処理が1行で直感的に読めるか
    1. Yes → 三項演算子でもOK
    2. No → if文にして構造をはっきりさせる
  3. 副作用(ログ出力、リスト操作など)を含んでいないか
    1. 含んでいる → if文の方が安全
  4. 将来、条件が増える可能性が高いか
    1. 高い → 拡張しやすいif/elif/elseにしておく

要するに、「短く書くこと」よりも「未来の自分や他人が読めること」を優先し、三項演算子は「シンプルな値切り替え専用の道具」として使うのが、安全なスタイルです。

実践的な三項演算子の活用例

デフォルト値の設定に三項演算子を使う

現場でよくあるパターンとして、「None や空文字だったら、デフォルト値を使いたい」というケースがあります。

三項演算子はこのような場面でよく使われます。

None のときにデフォルト名を使う

Python
name_from_db = None

# None のときは "ゲスト" を使う
display_name = name_from_db if name_from_db is not None else "ゲスト"

print(display_name)
実行結果
ゲスト

このように、「条件がシンプルで、代入する値もシンプル」な場合には、三項演算子で非常に分かりやすく書けます。

空文字をデフォルトに置き換える例

Python
input_name = ""

# 空文字ならデフォルト表示名に置き換える
display_name = input_name if input_name != "" else "名称未設定"

print(display_name)
実行結果
名称未設定

なお、単純に「偽っぽい値ならデフォルト」という意味でよい場合は、Pythonではorを使って次のように書くこともできます。

Python
input_name = ""
display_name = input_name or "名称未設定"
print(display_name)
実行結果
名称未設定

ただし、この場合は0[]なども「偽」と判定されることを理解した上で使う必要があります。

「None のときだけデフォルト」など、意味を厳密にしたい場合は三項演算子の方が明確です。

リスト内包表記と三項演算子の組み合わせ

リスト内包表記と三項演算子は、相性のよい組み合わせです。

各要素ごとに条件付きで値を変換したい場合などに、よく使われます。

偶数・奇数をラベル文字列に変換する例

Python
numbers = [1, 2, 3, 4, 5]

# 各要素が偶数か奇数かでラベルを切り替える
labels = ["偶数" if n % 2 == 0 else "奇数" for n in numbers]

print(labels)
実行結果
['奇数', '偶数', '奇数', '偶数', '奇数']

このように、「1つの要素に対して1つの値を選ぶ」というパターンでは、三項演算子を組み合わせることで非常にコンパクトかつ読みやすいコードになります。

None を 0 に置き換える変換

Python
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]

ここでも、条件は短く、選ぶ値も短いという形になっているため、三項演算子が自然に読める範囲に収まっています。

関数内での条件分岐を一行で書く方法

最後に、関数の戻り値を条件で切り替える実践的な例を見てみます。

関数の中で「返す値だけを変えたい」場合は、三項演算子を使うと非常にスッキリします。

割引率を返す関数の例

Python
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 文と三項演算子の組み合わせがとても読みやすいです。

ログインメッセージを返す例

Python
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コーディングをより快適にしてくれます。

コーディングテクニック

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

URLをコピーしました!