多くのPython初心者はif
、elif
、else
で条件文を書くことに慣れていますが、コードがどんどん長くなり、入れ子にされると可読性が低下し始めます。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なスタイルは単に行数を減らすのではなく、意図を明確に示すことを目的としています。
今後条件文を作成する際には、これらの例を少しずつ適用していくことで、自然により優雅なコードを書くことができるでしょう。
シンプルなものは複雑なものよりも良い。 — from The Zen of Python
Add a New Comment