【Python入門】三項演算子の使い方まとめ|if文を1行で書ける便利テク!

python

Pythonでよく使うif文ですが、「ちょっとした条件分岐を1行で書けたら便利だな」と思ったことはありませんか?

そんなときに活躍するのが三項演算子(別名:条件式、条件演算子)です。

三項演算子のメリット:

  • コードが簡潔になる
  • 可読性が向上する(適切に使えば)
  • 関数型プログラミングのスタイルに合う
  • リスト内包表記などとの相性が良い

よくある場面:

# 従来のif文
if score >= 60:
    result = "合格"
else:
    result = "不合格"

# 三項演算子なら1行
result = "合格" if score >= 60 else "不合格"

Pythonの三項演算子は、可読性が高く、簡潔に条件分岐を記述できる便利な書き方です。

この記事では、Pythonの三項演算子の基本構文・使い方・注意点・実用例までを、初心者にもやさしく解説します。

スポンサーリンク

第1章:三項演算子とは?基本構文を覚えよう

三項演算子の基本構文

値1 if 条件 else 値2

意味:「条件が真(True)なら値1、偽(False)なら値2を返す」

読み方:

  • 左から「値1 もし 条件 そうでなければ 値2」
  • 日本語順で「もし条件なら値1、そうでなければ値2」

基本的な使用例

# 年齢による分類
age = 18
status = "成人" if age >= 18 else "未成年"
print(status)  # 成人

# 数値の正負判定
number = -5
sign = "正の数" if number > 0 else "負の数または0"
print(sign)  # 負の数または0

# 空文字チェック
name = ""
display_name = name if name else "名無し"
print(display_name)  # 名無し

従来のif文との比較

# 従来のif文(5行)
temperature = 30
if temperature >= 25:
    message = "暑いです"
else:
    message = "快適です"

# 三項演算子(1行)
temperature = 30
message = "暑いです" if temperature >= 25 else "快適です"

print(message)  # 暑いです

なぜ「三項」演算子と呼ばれるの?

# 3つの要素(項)を持つから「三項」演算子
値1    if    条件    else    値2
↑      ↑     ↑       ↑      ↑
項1   演算子  項2   演算子   項3

第2章:三項演算子の応用例と便利な活用法

1. 出力・表示の切り替えに使う

# コンソール出力での使用
score = 85
print("合格" if score >= 60 else "不合格")

# ログメッセージでの使用
is_debug = True
print(f"[DEBUG] 詳細情報" if is_debug else "[INFO] 基本情報")

# フォーマット文字列での使用
users_count = 1
print(f"{users_count} {'user' if users_count == 1 else 'users'} found")

2. 関数の戻り値に使う

def get_discount(price):
    """1000円以上なら20%割引、そうでなければ割引なし"""
    return price * 0.8 if price >= 1000 else price

def get_grade(score):
    """60点以上なら合格、そうでなければ不合格"""
    return "合格" if score >= 60 else "不合格"

def is_even_or_odd(number):
    """偶数か奇数かを判定"""
    return "偶数" if number % 2 == 0 else "奇数"

# 使用例
print(get_discount(1500))    # 1200.0
print(get_grade(75))         # 合格
print(is_even_or_odd(7))     # 奇数

3. リスト内包表記と組み合わせる

# 数値の分類
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
parity = ["偶数" if n % 2 == 0 else "奇数" for n in numbers]
print(parity)
# ['奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数']

# 温度の分類
temperatures = [15, 25, 35, 5, 45]
comfort_levels = ["快適" if 20 <= temp <= 30 else "不快" for temp in temperatures]
print(comfort_levels)
# ['不快', '快適', '不快', '不快', '不快']

# 文字列の長さチェック
words = ["apple", "a", "banana", "", "cherry"]
lengths = ["短い" if len(word) <= 3 else "長い" for word in words]
print(lengths)
# ['短い', '短い', '長い', '短い', '長い']

4. 辞書作成での使用

# 辞書内包表記での使用
numbers = range(1, 6)
number_types = {n: "偶数" if n % 2 == 0 else "奇数" for n in numbers}
print(number_types)
# {1: '奇数', 2: '偶数', 3: '奇数', 4: '偶数', 5: '奇数'}

# 学生の成績判定
students = [
    {"name": "Alice", "score": 85},
    {"name": "Bob", "score": 45},
    {"name": "Charlie", "score": 92}
]

results = {
    student["name"]: "合格" if student["score"] >= 60 else "不合格"
    for student in students
}
print(results)
# {'Alice': '合格', 'Bob': '不合格', 'Charlie': '合格'}

5. 変数の初期化・デフォルト値設定

def create_user(name, email, age=None):
    """ユーザー情報を作成"""
    return {
        "name": name,
        "email": email,
        "age": age if age is not None else "未設定",
        "is_adult": True if age and age >= 18 else False,
        "display_name": name if name else "匿名ユーザー"
    }

# 使用例
user1 = create_user("Alice", "alice@example.com", 25)
user2 = create_user("", "bob@example.com", None)

print(user1)
# {'name': 'Alice', 'email': 'alice@example.com', 'age': 25, 'is_adult': True, 'display_name': 'Alice'}

print(user2)
# {'name': '', 'email': 'bob@example.com', 'age': '未設定', 'is_adult': False, 'display_name': '匿名ユーザー'}

6. APIレスポンスの処理

def process_api_response(response):
    """APIレスポンスを処理"""
    status = "成功" if response.get("status") == "ok" else "失敗"
    data = response.get("data") if response.get("data") else {}
    message = response.get("message") if response.get("message") else "メッセージなし"
    
    return {
        "status": status,
        "data": data,
        "message": message
    }

# 使用例
api_response = {"status": "ok", "data": {"user_id": 123}, "message": ""}
result = process_api_response(api_response)
print(result)
# {'status': '成功', 'data': {'user_id': 123}, 'message': 'メッセージなし'}

第3章:三項演算子の注意点と落とし穴

よくある間違いパターン

1. 構文の順序間違い

# 間違い:条件が最初に来てしまう
# if condition then value1 else value2  # これは他の言語
# if age >= 18 "成人" else "未成年"     # SyntaxError

# 正しい:Pythonでは値が最初
status = "成人" if age >= 18 else "未成年"

2. 複雑すぎる条件の詰め込み

# 悪い例:読みにくい
score = 85
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "F"

# 良い例:分かりやすく分ける
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"

3. 副作用のある操作の使用

# 危険:副作用のある操作を三項演算子で行う
counter = 0

# 悪い例:increment_counter()が呼ばれるタイミングが分かりにくい
def increment_counter():
    global counter
    counter += 1
    return counter

result = increment_counter() if True else 0  # 副作用あり

# 良い例:副作用のある操作は明確に分ける
if True:
    result = increment_counter()
else:
    result = 0

ネスト(入れ子)の三項演算子

# ネストした三項演算子は避けるべき
x = 15
result = "大" if x > 20 else "中" if x > 10 else "小"

# 読みやすい書き方
if x > 20:
    result = "大"
elif x > 10:
    result = "中"
else:
    result = "小"

# ただし、シンプルなネストなら許容範囲
temperature = 25
clothing = "半袖" if temperature > 25 else "長袖" if temperature > 15 else "厚着"

パフォーマンスに関する注意

# 重い処理を含む場合は注意
def heavy_calculation():
    """重い計算処理"""
    import time
    time.sleep(1)  # 1秒の処理をシミュレート
    return 100

# 条件によっては無駄な計算が発生
condition = False
result = heavy_calculation() if condition else 0  # conditionがFalseでも計算される

# 改善版:通常のif文を使用
if condition:
    result = heavy_calculation()
else:
    result = 0

第4章:三項演算子とif文、どう使い分ける?

使い分けの基準

条件おすすめ理由
単純な条件で値を切り替え三項演算子簡潔で読みやすい
複数の条件や複雑な処理if-elif-else文可読性が高い
1行で済む処理三項演算子コードがスッキリ
複数行の処理が必要if文処理の流れが明確
リスト内包表記内三項演算子構文的に適している
デバッグが必要if文ブレークポイントを設置しやすい

実践的な使い分け例

# 三項演算子が適切なケース
# 1. 単純な値の切り替え
message = "ログイン成功" if user_authenticated else "ログイン失敗"

# 2. デフォルト値の設定
name = user_input if user_input else "ゲスト"

# 3. 関数の戻り値
def get_max(a, b):
    return a if a > b else b

# 4. リスト内包表記での値変換
numbers = [1, 2, 3, 4, 5]
absolute_values = [n if n >= 0 else -n for n in numbers]

# if文が適切なケース
# 1. 複数の処理が必要
if is_member and has_coupon:
    price *= 0.5
    log_discount_applied()
    send_notification()
else:
    log_regular_price()

# 2. 複雑な条件分岐
if user.is_premium():
    apply_premium_benefits()
    update_premium_stats()
elif user.is_trial():
    check_trial_expiry()
    show_upgrade_prompt()
else:
    show_registration_form()

# 3. エラーハンドリング
try:
    result = risky_operation()
except ValueError:
    handle_value_error()
    result = default_value
except TypeError:
    handle_type_error()
    result = alternative_value

可読性を重視した判断

# 短くて分かりやすい → 三項演算子
status = "オンライン" if is_connected else "オフライン"

# 条件が複雑 → if文
if user.age >= 18 and user.has_permission("admin") and not user.is_banned:
    grant_admin_access()
else:
    deny_access()

# 処理が複数行 → if文
if payment_successful:
    update_inventory()
    send_confirmation_email()
    log_purchase()
else:
    refund_payment()
    notify_failure()

第5章:実践的な三項演算子の活用テクニック

Web開発での活用

def render_user_status(user):
    """ユーザーステータスの表示"""
    # オンライン状態の表示
    online_status = "🟢 オンライン" if user.is_online else "⚪ オフライン"
    
    # プロフィール画像の設定
    avatar_url = user.avatar_url if user.avatar_url else "/static/default_avatar.png"
    
    # 権限表示
    role_display = "管理者" if user.is_admin else "一般ユーザー"
    
    return {
        "name": user.name,
        "status": online_status,
        "avatar": avatar_url,
        "role": role_display
    }

データ処理での活用

def process_sales_data(sales_records):
    """売上データの処理"""
    processed_data = []
    
    for record in sales_records:
        # 売上カテゴリの分類
        category = "高額" if record["amount"] >= 100000 else "通常"
        
        # 割引適用の判定
        discount_rate = 0.1 if record["is_member"] else 0.0
        
        # 最終金額の計算
        final_amount = record["amount"] * (1 - discount_rate)
        
        processed_data.append({
            "id": record["id"],
            "category": category,
            "original_amount": record["amount"],
            "final_amount": final_amount,
            "discount_applied": "あり" if discount_rate > 0 else "なし"
        })
    
    return processed_data

設定管理での活用

import os

class Config:
    """アプリケーション設定"""
    # 環境変数からの設定読み込み
    DEBUG = os.getenv("DEBUG", "False").lower() == "true"
    DATABASE_URL = os.getenv("DATABASE_URL") or "sqlite:///default.db"
    
    # デバッグモードに応じた設定
    LOG_LEVEL = "DEBUG" if DEBUG else "INFO"
    CACHE_TIMEOUT = 0 if DEBUG else 300
    
    # 環境に応じたAPI URL
    API_BASE_URL = (
        "http://localhost:8000" if DEBUG 
        else "https://api.production.com"
    )
    
    @classmethod
    def get_database_config(cls):
        """データベース設定の取得"""
        return {
            "url": cls.DATABASE_URL,
            "echo": True if cls.DEBUG else False,
            "pool_size": 1 if cls.DEBUG else 10
        }

まとめ

三項演算子は、短く・読みやすく・便利に条件分岐を表現できるPythonの強力な機能です。

正しく使えば、コードの品質や保守性が大きく向上します。

本記事の重要ポイント

基本構文:

  • 値1 if 条件 else 値2 の順序を覚える
  • 条件が真なら値1、偽なら値2が返される
  • 1行で簡潔に条件分岐を表現

適切な使用場面:

  • 単純な値の切り替え:状態表示、デフォルト値設定
  • 関数の戻り値:シンプルな判定処理
  • リスト内包表記:データ変換やフィルタリング
  • 変数の初期化:設定値の切り替え

避けるべき使い方:

  • 複雑すぎる条件:ネストしすぎると可読性が低下
  • 副作用のある操作:予期しない動作の原因
  • 複数行の処理:if文の方が適している

コメント

タイトルとURLをコピーしました