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文の方が適している
コメント