読み込み中...

Pythonの条件演算子を使ってif文を簡潔に書き換える5つの方法

条件演算子 徹底解説 Python
この記事は約23分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●Pythonの条件演算子とは?基礎から応用まで

Pythonでは、コードの簡潔さと可読性が非常に重要です。

特に条件分岐を扱う際、冗長なコードは避けたいものです。そこで登場するのが条件演算子です。

条件演算子は、if-else文を一行で表現できる強力な構文で、コードの簡潔さを極限まで追求したい開発者にとって、まさに救世主といえるでしょう。

○条件演算子の基本構文と動作原理

条件演算子は、三項演算子とも呼ばれ、その名の通り3つの部分から構成されています。

基本的な構文は次の通りです。

結果 = 真の場合の値 if 条件 else 偽の場合の値

この構文は、一見複雑に見えるかもしれませんが、実際にはとてもシンプルです。

条件が真の場合は最初の値が、偽の場合は else 以降の値が結果として返されます。

具体例を見てみましょう。

年齢に基づいて飲酒可能かどうかを判断するコードを書いてみます。

age = 20
status = "飲酒可能" if age >= 20 else "飲酒不可"
print(status)

実行結果

飲酒可能

このコードでは、age が20以上であれば “飲酒可能”、そうでなければ “飲酒不可” という文字列が status 変数に代入されます。

age が20なので、結果は “飲酒可能” となります。

条件演算子の動作原理を理解するには、通常のif-else文との比較が有効です。

上記のコードを通常のif-else文で書くと、次のようになります。

age = 20
if age >= 20:
    status = "飲酒可能"
else:
    status = "飲酒不可"
print(status)

見ての通り、条件演算子を使用すると、4行のコードを1行に圧縮できます。

コードの行数が減ることで、可読性が向上し、バグの発生リスクも低減されます。

○if文との比較/どんな時に使うべきか

条件演算子とif文、どちらを使うべきか迷うことがあるかもしれません。

両者にはそれぞれ長所があり、状況に応じて使い分けることが重要です。

条件演算子は主に次のような場合に有効です。

  1. 単純な条件分岐/条件が1つで、真偽の結果がそれぞれ1つずつの場合。
  2. 変数への代入/条件に基づいて変数に値を代入する場合。
  3. 関数の戻り値/条件に基づいて関数が返す値を決定する場合。
  4. リスト内包表記との組み合わせ/リスト内の要素を条件に基づいて生成する場合。

一方、通常のif文は次のような場合に適しています。

  1. 複雑な条件分岐/複数の条件や、elif を使用する場合。
  2. 複数の処理/条件が真または偽の場合に複数の処理を行う必要がある場合。
  3. 可読性重視/条件や処理が複雑で、一行に収めると読みにくくなる場合。

具体例を見てみましょう。

まず、条件演算子が適している例です。

def get_discount(is_member):
    return 0.1 if is_member else 0.0

discount = get_discount(True)
print(f"割引率: {discount * 100}%")

実行結果

割引率: 10.0%

この例では、会員かどうかによって割引率を返す関数を定義しています。

条件が単純で、戻り値も1つの値なので、条件演算子が適しています。

次に、if文が適している例を見てみましょう。

def process_order(total, is_member, coupon):
    if is_member:
        discount = 0.1
        print("会員割引が適用されました。")
    elif coupon:
        discount = 0.05
        print("クーポン割引が適用されました。")
    else:
        discount = 0.0
        print("割引はありません。")

    final_total = total * (1 - discount)
    print(f"最終金額: {final_total}円")

process_order(10000, False, True)

実行結果

クーポン割引が適用されました。
最終金額: 9500.0円

この例では、会員状態とクーポンの有無に応じて割引を適用し、メッセージを出力しています。

複数の条件と処理があるため、通常のif文の方が適しています。

条件演算子とif文、どちらを選択するかは、コードの複雑さと可読性のバランスを考慮して決定します。

シンプルな条件分岐であれば条件演算子を使用し、複雑な場合はif文を使用するという原則を守ることで、効率的で読みやすいコードを書くことができます。

●5つの実践的な条件演算子の使い方

Pythonの条件演算子は、コードを簡潔に書くための強力な道具です。

しかし、その力を最大限に引き出すには、実践的な使い方を理解することが重要です。

ここでは、条件演算子を活用した5つのサンプルコードを通じて、その実践的な使い方を理解していきましょう。

初心者の方でも理解しやすいよう、段階的に難易度を上げていきます。

○サンプルコード1:シンプルな三項演算子の活用

まずは、最もシンプルな条件演算子の使い方から始めましょう。

例えば、ユーザーの年齢に基づいて、適切な挨拶文を生成するケースを考えてみます。

age = 25
greeting = "こんにちは、大人の方!" if age >= 20 else "こんにちは、若者!"
print(greeting)

実行結果

こんにちは、大人の方!

このコードでは、age変数の値が20以上であれば “こんにちは、大人の方!” を、そうでなければ “こんにちは、若者!” をgreeting変数に代入しています。

age が25なので、結果は “こんにちは、大人の方!” となります。

シンプルな三項演算子は、このように二者択一の状況で非常に便利です。

コードが簡潔になるだけでなく、読みやすさも向上します。

○サンプルコード2:複数条件を持つ条件演算子

次に、複数の条件を持つ場合の条件演算子の使い方を見ていきましょう。

例えば、成績に応じて評価を返す関数を作成してみます。

def get_grade(score):
    return "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "D" if score >= 60 else "F"

print(get_grade(85))
print(get_grade(72))
print(get_grade(55))

実行結果

B
C
F

このコードでは、複数の条件を連鎖させています。

score が90以上なら “A”、80以上90未満なら “B”、というように評価しています。

条件演算子を連鎖させることで、複数の条件分岐を1行で表現できます。

ただし、条件が多くなりすぎると可読性が低下する可能性があるため、使用する際は適切なバランスを取ることが重要です。

○サンプルコード3:条件演算子とリスト内包表記の組み合わせ

条件演算子は、リスト内包表記と組み合わせることでより強力になります。

例えば、数値のリストから偶数だけを抽出し、さらにその値を2倍にするケースを考えてみましょう。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = [num * 2 if num % 2 == 0 else num for num in numbers]
print(result)

実行結果

[1, 4, 3, 8, 5, 12, 7, 16, 9, 20]

このコードでは、リスト内包表記の中で条件演算子を使用しています。

各数値(num)が偶数(num % 2 == 0)の場合は2倍(num * 2)し、奇数の場合はそのまま(num)にしています。

リスト内包表記と条件演算子の組み合わせは、データ処理や変換のタスクで非常に便利です。

1行で複雑な処理を表現できるため、コードの簡潔さと読みやすさが向上します。

○サンプルコード4:条件演算子でのNone値の扱い方

Pythonでは、None値(nullに相当)の扱いが重要です。

条件演算子を使用して、None値を適切に処理する方法を見てみましょう。

def get_user_name(user):
    return user.name if user is not None else "Guest"

class User:
    def __init__(self, name):
        self.name = name

user1 = User("Alice")
user2 = None

print(get_user_name(user1))
print(get_user_name(user2))

実行結果

Alice
Guest

このコードでは、get_user_name関数が引数userを受け取り、userがNoneでない場合はuser.nameを、Noneの場合は “Guest” を返します。

条件演算子を使用することで、None値のチェックと代替値の設定を1行で簡潔に表現できます。

特に、オブジェクトの属性にアクセスする際のNull安全性を確保するのに役立ちます。

○サンプルコード5:条件演算子を使った再帰的な処理

最後に、条件演算子を使って再帰的な処理を行う例を見てみましょう。

フィボナッチ数列を計算する関数を作成します。

def fibonacci(n):
    return n if n <= 1 else fibonacci(n-1) + fibonacci(n-2)

for i in range(10):
    print(f"fibonacci({i}) = {fibonacci(i)}")

実行結果

fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(2) = 1
fibonacci(3) = 2
fibonacci(4) = 3
fibonacci(5) = 5
fibonacci(6) = 8
fibonacci(7) = 13
fibonacci(8) = 21
fibonacci(9) = 34

このコードでは、条件演算子を使って再帰的なfibonacci関数を定義しています。

n が1以下の場合は n をそのまま返し、それ以外の場合は fibonacci(n-1) + fibonacci(n-2) を返します。

条件演算子を使用することで、再帰関数をより簡潔に表現できます。

ただし、再帰処理は慎重に扱う必要があり、深い再帰はスタックオーバーフローを引き起こす可能性があるため、適切な終了条件を設定することが重要です。

●条件演算子の応用テクニック

Pythonの条件演算子は、基本的な使い方を習得すると、さらに高度なテクニックを学ぶ準備が整います。

ここでは、条件演算子を使ってコードをより簡潔に、そして効率的に書くための応用テクニックを紹介します。

○複数の条件分岐を一行で表現する方法

複数の条件分岐を一行で表現することは、コードの可読性と簡潔さを両立させる上で重要なスキルです。

例えば、ある数値の範囲に応じて異なる結果を返す関数を考えてみましょう。

def get_price_category(price):
    return "高額" if price >= 10000 else "中額" if price >= 5000 else "低額"

print(get_price_category(12000))
print(get_price_category(7000))
print(get_price_category(3000))

実行結果

高額
中額
低額

このコードでは、条件演算子を連鎖させることで、複数の条件分岐を一行で表現しています。

priceが10000以上なら “高額”、5000以上10000未満なら “中額”、5000未満なら “低額” を返します。

条件演算子の連鎖は、コードを非常に簡潔にする一方で、過度に使用すると可読性が低下する恐れがあります。

そのため、適度な使用を心がけ、必要に応じてコメントを追加するなど、他の開発者にも理解しやすいコードを心がけましょう。

○条件演算子を使った関数定義の簡略化

条件演算子は、関数定義を簡略化する際にも非常に有用です。

特に、短い関数や、条件に応じて異なる値を返す関数で効果を発揮します。

例えば、偶数か奇数かを判定する関数を考えてみましょう。

# 通常の関数定義
def is_even_normal(num):
    if num % 2 == 0:
        return True
    else:
        return False

# 条件演算子を使った関数定義
is_even_concise = lambda num: True if num % 2 == 0 else False

# さらに簡略化
is_even_super_concise = lambda num: num % 2 == 0

print(is_even_normal(4))
print(is_even_concise(5))
print(is_even_super_concise(6))

実行結果

True
False
True

このコードでは、3つの方法で偶数判定関数を定義しています。

通常の関数定義、条件演算子を使ったラムダ関数、そしてさらに簡略化したラムダ関数です。

条件演算子を使用することで、関数定義をより簡潔に表現できます。

特に、ラムダ関数と組み合わせると、1行で関数を定義できるため、コードの可読性が向上します。

ただし、複雑な論理を含む関数の場合は、通常の関数定義の方が適している場合もあるため、状況に応じて使い分けることが重要です。

○パフォーマンスを考慮した条件演算子の使い方

条件演算子は、適切に使用することでコードのパフォーマンスを向上させることができます。

特に、条件に応じて異なる処理を行う場合、条件演算子を使うことで処理速度を改善できる場合があります。

例えば、大量のデータを処理する際に、条件に応じて異なる計算を行う関数を考えてみましょう。

import time

# 通常のif文を使った関数
def process_data_if(data):
    result = []
    for item in data:
        if item > 0:
            result.append(item * 2)
        else:
            result.append(item * -1)
    return result

# 条件演算子を使った関数
def process_data_ternary(data):
    return [item * 2 if item > 0 else item * -1 for item in data]

# パフォーマンス比較
data = list(range(-100000, 100001))

start_time = time.time()
result_if = process_data_if(data)
end_time = time.time()
print(f"If文の実行時間: {end_time - start_time:.5f}秒")

start_time = time.time()
result_ternary = process_data_ternary(data)
end_time = time.time()
print(f"条件演算子の実行時間: {end_time - start_time:.5f}秒")

print("結果が一致:", result_if == result_ternary)

実行結果

If文の実行時間: 0.05934秒
条件演算子の実行時間: 0.03466秒
結果が一致: True

このコードでは、通常のif文を使った関数と条件演算子を使った関数のパフォーマンスを比較しています。

条件演算子を使った方が、処理速度が速くなっていることがわかります。

条件演算子を使用すると、リスト内包表記と組み合わせることで、ループ処理を最適化できます。

また、条件分岐の評価も効率的に行われるため、大量のデータを処理する際に特に効果を発揮します。

ただし、パフォーマンスの向上は、データの量や処理の複雑さによって異なります。

小規模なデータや単純な処理では、パフォーマンスの差はほとんど感じられない場合もあります。

そのため、コードの可読性とパフォーマンスのバランスを考慮しながら、適切に条件演算子を使用することが重要です。

●よくある間違いと対処法

Pythonの条件演算子は非常に便利な機能ですが、使い方を誤ると思わぬバグや可読性の低下を招く可能性があります。

ここでは、条件演算子を使用する際によくある間違いと、それらを避けるための対処法について詳しく解説します。

○条件演算子の可読性を高めるテクニック

条件演算子は簡潔なコードを書くのに適していますが、複雑な条件や長い式を使用すると、かえって可読性が低下してしまうことがあります。

可読性を高めるためのテクニックをいくつか紹介します。

まず、長い条件式や結果式は変数に分割することをおすすめします。

例えば、次のようなコードがあるとします。

result = "合格" if score >= 80 and attendance >= 90 and not disqualified else "不合格"

このコードは一見簡潔に見えますが、条件が複雑で理解しづらいです。

そこで、条件を分割して変数に代入することで可読性を高めることができます。

score_condition = score >= 80
attendance_condition = attendance >= 90
qualification_condition = not disqualified
is_passed = score_condition and attendance_condition and qualification_condition

result = "合格" if is_passed else "不合格"

print(result)

実行結果

合格

このように条件を分割することで、各条件の意味が明確になり、コードの理解が容易になります。

また、複雑な条件演算子は関数にまとめることも効果的です。

def check_pass_criteria(score, attendance, disqualified):
    score_condition = score >= 80
    attendance_condition = attendance >= 90
    qualification_condition = not disqualified
    return score_condition and attendance_condition and qualification_condition

score = 85
attendance = 95
disqualified = False

result = "合格" if check_pass_criteria(score, attendance, disqualified) else "不合格"
print(result)

実行結果

合格

関数にまとめることで、コードの再利用性が高まり、メインのロジックがより明確になります。

○複雑な条件演算子をデバッグする方法

条件演算子は簡潔で便利ですが、複雑になるとデバッグが難しくなることがあります。

効果的なデバッグ方法をいくつか紹介します。

まず、条件演算子を一時的に通常のif-else文に展開することがデバッグに役立ちます。

例えば、次のような条件演算子があるとします。

result = value_a if condition_x and condition_y else value_b if condition_z else value_c

デバッグ時には、このコードを次のように展開できます。

if condition_x and condition_y:
    result = value_a
elif condition_z:
    result = value_b
else:
    result = value_c

print(result)

この方法により、各条件の評価結果を個別に確認しやすくなります。

また、printデバッグを活用するのも効果的です。

条件演算子の各部分の値を出力することで、予期せぬ動作の原因を特定しやすくなります。

condition_x = True
condition_y = False
condition_z = True
value_a = "A"
value_b = "B"
value_c = "C"

print(f"condition_x: {condition_x}")
print(f"condition_y: {condition_y}")
print(f"condition_z: {condition_z}")

result = value_a if condition_x and condition_y else value_b if condition_z else value_c
print(f"Result: {result}")

実行結果

condition_x: True
condition_y: False
condition_z: True
Result: B

このように、各条件の値を出力することで、どの条件がTrueやFalseになっているかを確認でき、予期せぬ結果の原因を特定しやすくなります。

○条件演算子vs通常のif文、使い分けの指針

条件演算子と通常のif文、どちらを使うべきか迷うことがあるでしょう。

使い分けの指針をいくつか提示します。

条件演算子は、次のような場合に適しています。

  1. 単純な条件分岐で、結果が1行で表現できる場合
  2. 変数への代入や関数の戻り値として使用する場合
  3. リスト内包表記と組み合わせて使用する場合

例えば、以下のようなケースでは条件演算子が適しています。

age = 25
status = "成人" if age >= 20 else "未成年"
print(status)

実行結果

成人

一方、通常のif文は次のような場合に適しています。

  1. 複数の条件分岐がある場合(elif文を使用する場合)
  2. 条件分岐の結果として複数の処理を行う必要がある場合
  3. 条件や結果の式が長く、1行で書くと可読性が低下する場合

例えば、次のようなケースでは通常のif文が適しています。

age = 25
if age < 13:
    print("子供料金です")
    price = 1000
elif 13 <= age < 65:
    print("大人料金です")
    price = 2000
else:
    print("シニア料金です")
    price = 1500

print(f"料金は{price}円です")

実行結果

大人料金です
料金は2000円です

このように、条件が複数あり、各条件に応じて複数の処理を行う場合は、通常のif文の方が適しています。

条件演算子と通常のif文、どちらを選択するかは、コードの複雑さと可読性のバランスを考慮して決定しましょう。

簡潔に書けるからといって、無理に条件演算子を使用する必要はありません。

チームのコーディング規約や、他の開発者が読みやすいかどうかも考慮に入れて、適切な選択をすることが重要です。

●Pythonの条件演算子に関するQ&A

Pythonの条件演算子について、多くの開発者が疑問に思う点があります。

ここでは、よくある質問とその回答を通じて、条件演算子の理解をさらに深めていきましょう。

○Q1:条件演算子でelseを省略できますか?

条件演算子でelseを省略することはできません。Pythonの条件演算子は常に「真の場合の値 if 条件 else 偽の場合の値」という形式を取る必要があります。

例えば、次のようなコードは文法エラーとなります。

# 誤った使用例
result = "True" if condition

しかし、elseを省略したような動作を実現したい場合、Noneを使用することで似たような効果を得ることができます。

condition = True
result = "True" if condition else None

print(result)

実行結果

True

この方法では、条件が偽の場合にNoneが返されます。

ただし、この方法を使用する際は、Noneが返される可能性があることを常に意識し、適切に処理する必要があります。

○Q2:条件演算子で複数の処理を行うには?

条件演算子は基本的に単一の式しか扱えませんが、カンマを使用することで複数の処理を行うことができます。

ただし、この方法は可読性を低下させる可能性があるため、慎重に使用する必要があります。

例えば、次のように複数の処理を行うことができます:

x = 10
y = 20

result = (x + 1, y + 1) if x > y else (x - 1, y - 1)

print(result)

実行結果

(9, 19)

このコードでは、x > y の条件が偽であるため、(x – 1, y – 1) が実行され、結果として (9, 19) が返されます。

ただし、複数の処理を行う場合は、可読性と保守性の観点から、通常のif文を使用することをお勧めします。

x = 10
y = 20

if x > y:
    x += 1
    y += 1
else:
    x -= 1
    y -= 1

print(x, y)

実行結果

9 19

この方法では、各処理が明確に分かれているため、コードの意図がより理解しやすくなります。

○Q3:条件演算子とswitch文の違いは?

Pythonには他の言語でよく見られるswitch文が存在しません。

しかし、条件演算子や辞書を使用することで、switch文に似た動作を実現することができます。

条件演算子を使用してswitch文のような動作を実現する例を見てみましょう。

def get_day_type(day):
    return "平日" if day in ["月", "火", "水", "木", "金"] else "休日" if day in ["土", "日"] else "無効な日"

print(get_day_type("月"))
print(get_day_type("土"))
print(get_day_type("invalid"))

実行結果

平日
休日
無効な日

この方法は簡単ですが、条件が多くなると可読性が低下する可能性があります。

より複雑なケースでは、辞書を使用する方が効果的です:

def get_day_type(day):
    day_types = {
        "月": "平日",
        "火": "平日",
        "水": "平日",
        "木": "平日",
        "金": "平日",
        "土": "休日",
        "日": "休日"
    }
    return day_types.get(day, "無効な日")

print(get_day_type("月"))
print(get_day_type("土"))
print(get_day_type("invalid"))

実行結果

平日
休日
無効な日

この方法では、辞書のキーを使って各ケースを定義し、get()メソッドのデフォルト値を使用してデフォルトケースを処理しています。

これで、switch文に非常に近い動作を実現できます。

条件演算子とswitch文の主な違いは、条件演算子が2つの選択肢間で選択するのに対し、switch文は複数の選択肢から1つを選択する点です。

Pythonでは、条件演算子と辞書を組み合わせることで、他の言語のswitch文に相当する機能を実現できます。

まとめ

Pythonの条件演算子について、基礎から応用まで幅広く解説してきました。

条件演算子は、コードを簡潔に書くための優れたツールであり、適切に使用することで可読性と効率性を同時に向上させることができます。

本記事で学んだ知識とテクニックを活用することで、より効率的で洗練されたPythonコードを書くことができるようになるでしょう。

条件演算子の適切な使用は、コードの品質を向上させ、結果としてチーム内でのあなたのコーディングスキルの評価も高まることでしょう。