多くのPython初心者はifelifelseで条件文を書くことに慣れていますが、コードがどんどん長くなり、入れ子にされると可読性が低下し始めます。Pythonは「読みやすいコード」を追求する言語であり、条件文もより優雅で簡潔に表現できるさまざまな方法を提供します。

この記事では、従来の条件文から脱却して、よりPythonicに条件分岐を処理するためのヒントと例を紹介します。


1. 条件表現 (Conditional Expression, aka 三項演算子)

status = "成人" if age >= 18 else "未成年"
  • 1行でif/else表現が可能
  • ただし、入れ子に使うことは避ける(可読性低下)

2. Truthy / Falsy 値を活用する

if items:
    print("リストに項目があります。")

Pythonでは次のような値が条件文においてFalseと評価されます: - 空のコンテナ ([], {}, '') - 数字の0 (0, 0.0) - None

その他の値はすべてTrueと見なされるため、上記のコードが成り立ちます。

初心者は次のようなコードをよく書きます:

if len(items) > 0:
    print("リストに項目があります。")

しかし、Pythonではlen(items)が0の場合はFalse、1以上の場合はTrueと扱われるため、上記のコードを簡略化してif items:とすることができます。

このような方法は、可読性簡潔性Python 的なコードスタイルという三つのウサギをすべてつかむ方法です。ただし、あまりに省略しすぎて意図が曖昧になる場合には、コメントなどを添えるのも良いでしょう。


3. Guard Clauseで入れ子を減らす

def process(user):
    if not user.is_active:
        return "非アクティブユーザーです。"
    # 以下ロジック
  • ifの中にコードブロックを入れ子にするのではなく、迅速にreturnや終了する方法
  • 条件が満たされない場合は早めに抜け出す(early return)

4. 辞書で条件分岐を代替する

def get_status(code):
    return {
        200: "OK",
        404: "見つかりません",
        500: "サーバーエラー"
    }.get(code, "不明")
  • if-elifの代わりにdictマッピングで可読性向上
  • .get()を使用してデフォルト値の設定も可能

5. any() / all()で複雑な条件を減らす

if any([is_admin, is_staff, is_moderator]):
    grant_access()
  • 複数の条件の中で1つでもTrueの場合 → any()
  • すべての条件がTrueでなければならない場合 → all()

6. or演算子を活用したデフォルト値処理

Pythonのor演算子は左側の値がFalseと評価されると右側の値を返すという性質を持ちます。この性質を利用することで、以下のように優雅にデフォルト値を指定できます:

username = input("名前を入力してください: ") or "名前なし"

また、関数の戻り値が空の場合でもフォールバック値を自然に指定できます:

items = get_items() or ["デフォルト項目"]

この方法は条件文なしでも短く直感的に代替値を指定できるため非常に便利です。

🔍 辞書にアクセスする際の.get('key', 'default')は、安全にキーの存在を確認しつつデフォルト値を返します。しかし、orは辞書ではなく一般的な変数や関数の戻り値などを扱うときにより簡潔にフォールバック処理するのに適しています。


7. パターンマッチング (match-case) - Python 3.10+

def handle_error(code):
    match code:
        case 400:
            return "不正リクエスト"
        case 404:
            return "見つかりません"
        case _:
            return "不明なエラー"
  • Python 3.10以上で使用可能
  • switch-caseの代替、構造分解も可能

結論

条件文を簡潔に整理することで、コードの可読性と保守性が大幅に向上します。Pythonicなスタイルは単に行数を減らすのではなく、意図を明確に示すことを目的としています。

今後条件文を作成する際には、これらの例を少しずつ適用していくことで、自然により優雅なコードを書くことができるでしょう。


Tux Zen

シンプルなものは複雑なものよりも良い。 — from The Zen of Python