読み込み中...

比較演算子による条件分岐の最適な活用方法10選

比較演算子 徹底解説 Python
この記事は約34分で読めます。

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

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

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

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

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

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

●Python比較演算子の基礎知識

Pythonにおいて、比較演算子は非常に重要な役割を果たします。

プログラムの流れを制御し、データを分析する上で欠かせないツールです。

皆さんも日常生活で「これはあれより大きい」「この2つは同じだ」といった比較を頻繁に行っているはずです。

Pythonの比較演算子も、まさにそのような比較を行うための機能を提供しています。

○比較演算子とは何か?

比較演算子は、2つの値を比較し、その結果をブール値(TrueまたはFalse)で返す演算子です。

数値、文字列、オブジェクトなど、様々な型のデータを比較できます。

プログラムの条件分岐や繰り返し処理で頻繁に使用されるため、効果的に活用できるようになると、コーディングの幅が大きく広がります。

たとえば、ユーザーの年齢が18歳以上かどうかを確認するプログラムを作る場合、比較演算子を使用して次のように記述できます。

age = 20
is_adult = age >= 18
print(f"成人ですか? {is_adult}")

実行結果

成人ですか? True

この例では、「>=」(以上)という比較演算子を使用して、ageが18以上かどうかを判断しています。

結果がTrueなので、このユーザーは成人であることがわかります。

○Pythonで使用できる比較演算子一覧

Pythonには、様々な比較演算子が用意されています。

それぞれの演算子の使い方を理解することで、より柔軟で効率的なコードを書くことができます。

ここでは、主な比較演算子を紹介します。

  1. 等しい(==)
  2. 等しくない(!=)
  3. より大きい(>)
  4. より小さい(<)
  5. 以上(>=)
  6. 以下(<=)
  7. オブジェクトが同一(is)
  8. オブジェクトが異なる(is not)

これらの演算子を使いこなすことで、複雑な条件分岐も簡潔に表現できるようになります。

例えば、ある商品の在庫状況と価格を同時にチェックする場合、次のようなコードが書けます。

stock = 5
price = 1000

if stock > 0 and price <= 1500:
    print("この商品は在庫があり、予算内です。")
else:
    print("条件を満たしていません。")

実行結果

この商品は在庫があり、予算内です。

この例では、「>」と「<=」の2つの比較演算子を使用し、さらにand演算子で条件を組み合わせています。

在庫が0より多く、かつ価格が1500以下であれば、条件を満たすとみなします。

○比較演算子の優先順位

プログラミングにおいて、演算子の優先順位を理解することは非常に重要です。

複数の演算子を組み合わせて使用する際、どの演算が先に行われるかによって結果が大きく変わってしまう可能性があるからです。

Pythonの比較演算子の優先順位は次の通りです。

  1. is、is not(同一性比較)
  2. <、<=、>、>=、!=、==(値の比較)
  3. not(論理否定)
  4. and(論理積)
  5. or(論理和)

この優先順位を踏まえて、複雑な条件式を書く際は括弧を適切に使用することで、意図した通りの結果を得ることができます。

例えば、次のような条件式を考えてみましょう。

x = 5
y = 10
z = 15

result = x < y and y < z or x == z
print(result)

実行結果

True

この式は、andがorよりも優先順位が高いため、「(x < y and y < z) or x == z」と解釈されます。

xはyより小さく、yはzより小さいため、最初の条件がTrueとなり、全体の結果もTrueになります。

一方、括弧を使って優先順位を変更すると、結果が変わる場合があります。

x = 5
y = 10
z = 15

result = x < y and (y < z or x == z)
print(result)

実行結果

True

この場合、括弧内の条件が先に評価されますが、結果は同じくTrueとなります。

しかし、値を変更すると結果が変わる可能性があります。

比較演算子の優先順位を正しく理解し、必要に応じて括弧を使用することで、意図した通りの条件式を書くことができます。

また、複雑な条件式は小さな部分に分けて段階的に評価することで、可読性を向上させることもできます。

●Python比較演算子の活用法10選

Python比較演算子の基礎を学んだところで、実践的な活用法を見ていきましょう。

比較演算子は、単純な数値の比較から複雑なデータ構造の操作まで、幅広い場面で活躍します。

ここでは、日常的なプログラミングタスクに役立つ10個のサンプルコードを紹介します。

○サンプルコード1:数値の大小比較

数値の大小比較は、比較演算子の最も基本的な使用方法です。

例えば、ユーザーの年齢に基づいて異なるメッセージを表示するプログラムを考えてみましょう。

age = 25

if age < 18:
    print("未成年です。")
elif age >= 18 and age < 65:
    print("成人です。")
else:
    print("シニアです。")

実行結果

成人です。

この例では、「<」と「>=」演算子を使用して年齢を比較しています。

条件分岐を使うことで、年齢に応じた適切なメッセージを表示できます。

○サンプルコード2:文字列の比較

文字列の比較も、比較演算子を使って簡単に行えます。

アルファベット順や辞書順での比較が可能です。

name1 = "Alice"
name2 = "Bob"

if name1 < name2:
    print(f"{name1}は{name2}より前にあります。")
else:
    print(f"{name2}は{name1}より前にあります。")

実行結果

Aliceは前にあります。

文字列比較では、各文字のASCII値を順番に比較します。

大文字と小文字は区別されるので注意が必要です。

○サンプルコード3:リスト要素の比較

リストの要素同士を比較する場合も、比較演算子が活躍します。

例えば、2つのリストの長さを比較してみましょう。

list1 = [1, 2, 3, 4, 5]
list2 = [1, 2, 3]

if len(list1) > len(list2):
    print("list1の方が要素数が多いです。")
elif len(list1) < len(list2):
    print("list2の方が要素数が多いです。")
else:
    print("両リストの要素数は同じです。")

実行結果

list1の方が要素数が多いです。

len()関数を使ってリストの長さを取得し、その値を比較しています。

リストの内容を比較したい場合は、==演算子を使用できます。

○サンプルコード4:複数条件の組み合わせ

複数の条件を組み合わせる際も、比較演算子が重要な役割を果たします。

and、or、notといった論理演算子と組み合わせることで、複雑な条件を表現できます。

temperature = 25
humidity = 60

if temperature > 30 and humidity > 70:
    print("蒸し暑い日です。")
elif temperature < 10 or humidity < 30:
    print("乾燥した日です。")
else:
    print("過ごしやすい日です。")

実行結果

過ごしやすい日です。

この例では、気温と湿度の両方を考慮して天気の状態を判断しています。

複数の条件を組み合わせることで、より精密な判断が可能になります。

○サンプルコード5:等しくない条件の判定

「等しくない」という条件は、!=演算子を使って表現できます。

これは、ある値が特定の値と異なることを確認したい場合に便利です。

user_input = input("好きな果物を入力してください(りんご、バナナ、オレンジ): ")

if user_input != "りんご" and user_input != "バナナ" and user_input != "オレンジ":
    print("指定された果物以外が入力されました。")
else:
    print(f"{user_input}が選択されました。")

実行結果(「ぶどう」と入力した場合)

指定された果物以外が入力されました。

この例では、ユーザーの入力が指定された果物リストに含まれていないかどうかを確認しています。

!=演算子を使うことで、想定外の入力を簡単にチェックできます。

○サンプルコード6:範囲内の値チェック

プログラミングでよく遭遇する場面として、ある値が特定の範囲内にあるかどうかを確認する必要がある場合があります。

例えば、テストの点数が合格ラインを超えているかどうかを判定するシナリオを考えてみましょう。

Python比較演算子を使えば、この判定を簡単に行えます。

score = 75
passing_score = 60
max_score = 100

if passing_score <= score <= max_score:
    print(f"合格です!あなたの点数は{score}点です。")
elif 0 <= score < passing_score:
    print(f"残念、不合格です。あなたの点数は{score}点です。")
else:
    print("無効な点数です。0から100の間で入力してください。")

実行結果

合格です!あなたの点数は75点です。

このコードでは、passing_score <= score <= max_scoreという式を使って、scoreが合格点以上かつ最高点以下であるかを一度に判定しています。

Pythonの比較演算子の面白い特徴として、この方法で複数の条件を一行で書けます。

まるで数学の不等式みたいですよね。

○サンプルコード7:オブジェクトの同一性確認

Pythonでは、==演算子とis演算子の違いを理解することが重要です。

==は値の比較、isはオブジェクトの同一性を確認します。

特に、リストやディクショナリなどの可変オブジェクトを扱う際に、この違いが重要になってきます。

list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1

print(list1 == list2)  # 値の比較
print(list1 is list2)  # オブジェクトの同一性確認
print(list1 is list3)  # 同じオブジェクトを参照

実行結果

True
False
True

面白いですね。

list1とlist2は同じ値を持っていますが、別々のオブジェクトなのでis演算子ではFalseになります。

一方、list3はlist1と同じオブジェクトを参照しているので、is演算子でもTrueになります。

この違いを理解すると、メモリの使用効率を考慮したコーディングができるようになります。

○サンプルコード8:ソート時の比較関数

Pythonのsorted()関数やlist.sort()メソッドは、カスタム比較関数を使ってソートの順序を制御できます。

これを利用すれば、複雑なデータ構造も思い通りにソートできるんです。

例えば、辞書のリストを特定のキーでソートする場合を考えてみましょう。

students = [
    {"name": "Alice", "score": 85},
    {"name": "Bob", "score": 92},
    {"name": "Charlie", "score": 78}
]

sorted_students = sorted(students, key=lambda x: x["score"], reverse=True)

for student in sorted_students:
    print(f"{student['name']}: {student['score']}点")

実行結果:

Bob: 92点
Alice: 85点
Charlie: 78点

ここでは、lambda関数を使って各要素の”score”キーの値を比較関数として使用しています。

reverse=Trueを指定することで、高得点順(降順)にソートしています。

比較演算子を直接使用しているわけではありませんが、内部的には比較演算子が使われています。

○サンプルコード9:三項演算子での活用

Python比較演算子と組み合わせて使用する便利な機能として、三項演算子があります。

これを使うと、簡単な条件分岐を1行で書けるようになります。

長いif-else文を短縮できて、コードがすっきりします。

age = 20
status = "成人" if age >= 18 else "未成年"
print(f"あなたは{status}です。")

実行結果

あなたは成人です。

この例では、age >= 18という比較演算子を使った条件が真の場合は”成人”、偽の場合は”未成年”という値をstatusに代入しています。

たった1行でif-else文と同じ動作を実現できるなんて、素敵じゃないですか?

○サンプルコード10:カスタム比較関数の作成

時には、標準の比較演算子だけでは不十分な場合があります。

例えば、複雑なオブジェクトを比較する際や、特殊な順序付けが必要な場合です。

そんな時は、カスタム比較関数を作成すると便利です。

Pythonの__lt__(less than)メソッドを使って、オブジェクトの比較方法をカスタマイズできます。

class Book:
    def __init__(self, title, author, year):
        self.title = title
        self.author = author
        self.year = year

    def __lt__(self, other):
        if self.author == other.author:
            return self.year < other.year
        return self.author < other.author

    def __repr__(self):
        return f"{self.title} by {self.author} ({self.year})"

books = [
    Book("1984", "George Orwell", 1949),
    Book("To Kill a Mockingbird", "Harper Lee", 1960),
    Book("Animal Farm", "George Orwell", 1945)
]

sorted_books = sorted(books)
for book in sorted_books:
    print(book)

実行結果

Animal Farm by George Orwell (1945)
1984 by George Orwell (1949)
To Kill a Mockingbird by Harper Lee (1960)

この例では、Bookクラスに__lt__メソッドを定義しています。

このメソッドは、まず著者名で比較し、著者が同じ場合は出版年で比較します。

結果として、本のリストが著者名順にソートされ、同じ著者の本は出版年順に並びます。

カスタム比較関数を使うと、データの特性に応じた柔軟な比較が可能になります。

例えば、本の人気度や評価なども考慮に入れた複雑な比較ロジックを実装できるでしょう。

●比較演算子と条件分岐

比較演算子の真価は、条件分岐と組み合わせた時に発揮されます。

Pythonのif文、elif文、else文を駆使すれば、プログラムの流れを自在に制御できるようになります。

ここからは、比較演算子を条件分岐で活用する方法を詳しく見ていきましょう。

○if文での活用方法

if文は、条件が真の場合にのみ特定のコードブロックを実行します。

比較演算子を使って条件を設定することで、柔軟な制御が可能になります。

例えば、ユーザーの年齢に応じて異なるメッセージを表示するプログラムを考えてみましょう。

age = int(input("あなたの年齢を入力してください: "))

if age < 20:
    print("未成年です。お酒は控えめに。")
if age >= 65:
    print("シニア割引が適用されます。")
if 20 <= age < 65:
    print("成人です。責任ある行動を心がけましょう。")

実行結果(35歳と入力した場合)

あなたの年齢を入力してください: 35
成人です。責任ある行動を心がけましょう。

このコードでは、複数のif文を使用しています。

各条件は独立して評価されるので、該当する全てのメッセージが表示されます。

例えば、65歳以上の場合は2つ目と3つ目の条件両方に当てはまるため、2つのメッセージが表示されることになります。

○elif、elseを使った複雑な条件分岐

より複雑な条件分岐を行う場合、elif(else if の略)とelseを使用します。

これで、互いに排他的な複数の条件を効率的に処理できます。

先ほどの年齢判定プログラムを改良してみましょう。

age = int(input("あなたの年齢を入力してください: "))

if age < 0:
    print("無効な年齢です。正の整数を入力してください。")
elif age < 20:
    print("未成年です。お酒は控えめに。")
elif age < 65:
    print("成人です。責任ある行動を心がけましょう。")
else:
    print("シニアです。割引が適用されます。")

実行結果(70歳と入力した場合)

あなたの年齢を入力してください: 70
シニアです。割引が適用されます。

この方法では、条件を順番に評価し、最初に真となる条件のブロックのみが実行されます。

そのため、コードがより効率的になり、意図しない動作を防ぐことができます。

○ネストされたif文の最適化

条件分岐が複雑になると、if文の中に別のif文を入れる(ネストする)ことがあります。

しかし、過度にネストされたif文は読みづらく、バグの温床となる可能性があります。

比較演算子と論理演算子を上手く組み合わせることで、ネストを減らし、コードを最適化できます。

# ネストされたif文の例
def check_eligibility(age, income):
    if age >= 18:
        if income >= 30000:
            return "ローン申請可能です。"
        else:
            return "年齢条件は満たしていますが、収入が不足しています。"
    else:
        return "年齢が18歳未満です。申請できません。"

# 最適化された版
def optimized_check_eligibility(age, income):
    if age < 18:
        return "年齢が18歳未満です。申請できません。"
    if income < 30000:
        return "年齢条件は満たしていますが、収入が不足しています。"
    return "ローン申請可能です。"

# 両方の関数をテスト
print(check_eligibility(20, 35000))
print(optimized_check_eligibility(20, 35000))

実行結果:

ローン申請可能です。
ローン申請可能です。

最適化された版では、条件を逆にすることでネストを減らし、コードの可読性を向上させています。

両方の関数は同じ結果を返しますが、optimized_check_eligibility関数の方が理解しやすく、メンテナンスも容易です。

●比較演算子と論理演算子の組み合わせ

比較演算子を単独で使用するだけでなく、論理演算子(and、or、not)と組み合わせることで、より複雑な条件を表現できます。

これで、プログラムの制御をさらに精密に行うことが可能になります。

○and、or、notの使い方

論理演算子を使うと、複数の条件を1つの式にまとめることができます。

  • and: 両方の条件が真の場合に真を返す
  • or: どちらかの条件が真の場合に真を返す
  • not: 条件の真偽を反転させる

例えば、ある商品の割引条件を考えてみましょう。

def apply_discount(price, is_member, purchase_count):
    if is_member and (price > 10000 or purchase_count > 5):
        discounted_price = price * 0.9  # 10%割引
        return f"割引適用後の価格: {discounted_price}円"
    return f"割引適用外です。価格: {price}円"

# テストケース
print(apply_discount(12000, True, 3))  # メンバーで、価格が10000円超
print(apply_discount(8000, True, 6))   # メンバーで、購入回数が5回超
print(apply_discount(9000, False, 7))  # メンバーではない

実行結果

割引適用後の価格: 10800.0円
割引適用後の価格: 7200.0円
割引適用外です。価格: 9000円

このコードでは、「メンバーであり、かつ(価格が10000円を超えるまたは購入回数が5回を超える)」という複雑な条件を、論理演算子を使って簡潔に表現しています。

○複雑な条件式の書き方

より複雑な条件を扱う場合、括弧を使って演算の優先順位を明確にすることが重要です。

また、条件式を変数に代入することで、コードの可読性を向上させることもできます。

def check_travel_eligibility(age, has_passport, has_visa, funds):
    is_adult = age >= 18
    has_documents = has_passport and has_visa
    has_sufficient_funds = funds >= 100000

    if is_adult and has_documents and has_sufficient_funds:
        return "海外旅行に行けます!楽しんできてください。"
    elif not is_adult:
        return "18歳未満の方は保護者の同伴が必要です。"
    elif not has_documents:
        return "パスポートとビザを確認してください。"
    else:
        return "十分な資金(10万円以上)が必要です。"

# テストケース
print(check_travel_eligibility(25, True, True, 150000))
print(check_travel_eligibility(17, True, True, 200000))
print(check_travel_eligibility(30, False, True, 120000))
print(check_travel_eligibility(22, True, True, 80000))

実行結果:

海外旅行に行けます!楽しんできてください。
18歳未満の方は保護者の同伴が必要です。
パスポートとビザを確認してください。
十分な資金(10万円以上)が必要です。

この例では、複数の条件を個別の変数に分解しています。

そうすることで、各条件の意味が明確になり、コードの保守性が向上します。

また、elif文を使用することで、条件の優先順位も明確に表現できています。

○短絡評価の活用

Pythonの論理演算子には「短絡評価」という特性があります。

これは、and演算子の場合、左側の式が偽であれば右側の式を評価せずに偽を返し、or演算子の場合、左側の式が真であれば右側の式を評価せずに真を返す動作を指します。

この特性を利用すると、効率的なコードを書くことができます。

def get_user_info(user_id):
    # ユーザー情報を取得する重い処理を想定
    print(f"ユーザーID {user_id} の情報を取得しています...")
    return {"id": user_id, "name": "テストユーザー"}

def is_admin(user_info):
    # 管理者かどうかを判定
    return user_info.get("role") == "admin"

def check_admin_access(user_id):
    user_info = get_user_info(user_id)
    if user_info and is_admin(user_info):
        return "管理者アクセス権限があります。"
    return "管理者アクセス権限がありません。"

# テストケース
print(check_admin_access(123))

実行結果

ユーザーID 123 の情報を取得しています...
管理者アクセス権限がありません。

この例では、user_info and is_admin(user_info)という条件式を使用しています。

もしget_user_infoNoneや空のディクショナリを返した場合、短絡評価によってis_admin関数は呼び出されません。

これで、不必要な処理を回避し、効率的なコードを実現しています。

●よくあるエラーと対処法

プログラミングの道を歩む上で、エラーとの遭遇は避けられません。

特に比較演算子を使用する際、思わぬ落とし穴に陥ることがあります。

ここでは、よく発生するエラーとその対処法を紹介します。

エラーメッセージを恐れず、むしろ学びの機会として捉えましょう。

○TypeError: 異なる型の比較

Pythonは型に厳格な言語ではありませんが、異なる型同士の比較には注意が必要です。

例えば、文字列と数値を直接比較しようとすると、TypeErrorが発生します。

age = 25
name = "Alice"

try:
    if age < name:
        print("年齢が名前より小さいです。")
except TypeError as e:
    print(f"エラーが発生しました: {e}")
    print("異なる型同士の比較はできません。")

実行結果

エラーが発生しました: '<' not supported between instances of 'int' and 'str'
異なる型同士の比較はできません。

この問題を回避するには、比較前に適切な型変換を行うか、比較可能な属性を使用します。

例えば、名前の長さと年齢を比較したい場合は次のようにします。

if age < len(name):
    print(f"年齢({age})が名前の文字数({len(name)})より小さいです。")
else:
    print(f"年齢({age})が名前の文字数({len(name)})以上です。")

実行結果

年齢(25)が名前の文字数(5)以上です。

○IndentationError: インデントの問題

Pythonでは、インデントが構文の一部です。

不適切なインデントは、IndentationErrorを引き起こします。

これは初心者がよく遭遇するエラーの一つです。

def check_number(num):
if num > 0:
    print("正の数です。")
  else:
    print("0または負の数です。")

check_number(5)

実行結果

  File "<stdin>", line 2
    if num > 0:
    ^
IndentationError: expected an indented block after function definition on line 1

この場合、関数定義の後のブロックが適切にインデントされていません。

正しくは次のようになります。

def check_number(num):
    if num > 0:
        print("正の数です。")
    else:
        print("0または負の数です。")

check_number(5)

実行結果

正の数です。

インデントは一貫性を保つことが重要です。

スペース4つまたはタブ1つを使用し、混在させないようにしましょう。

多くのエディタには自動インデント機能がありますので、活用するとよいでしょう。

○SyntaxError: 構文エラーの修正

SyntaxErrorは、Pythonの文法規則に違反した場合に発生します。

比較演算子を使う際によく見られるのが、条件式の括弧の付け忘れです。

x = 5
y = 10

if x == 5 and y = 10:  # '='を使っているため、SyntaxErrorが発生
    print("xは5で、yは10です。")

実行結果

  File "<stdin>", line 3
    if x == 5 and y = 10:
                    ^
SyntaxError: invalid syntax

この場合、代入演算子(=)ではなく、等価演算子(==)を使用する必要があります。

x = 5
y = 10

if x == 5 and y == 10:  # '=='を使用して修正
    print("xは5で、yは10です。")

実行結果

xは5で、yは10です。

SyntaxErrorが発生した場合は、エラーメッセージで指摘された行を注意深く確認しましょう。

多くの場合、タイプミスや括弧の不一致が原因です。

●Python比較演算子の応用例

ここまで学んできた比較演算子の知識を、実際のプログラミングシーンでどのように活用できるか見ていきましょう。

実務で遭遇しそうな具体的なシナリオを想定し、比較演算子を駆使して問題を解決する方法を探ります。

○サンプルコード11:データ検証システム

オンラインフォームからユーザー情報を受け取り、その有効性を確認するシステムを考えてみましょう。

年齢、メールアドレス、パスワードの強度をチェックします。

import re

def validate_user_data(age, email, password):
    errors = []

    # 年齢チェック
    if not (18 <= age <= 120):
        errors.append("年齢は18歳以上120歳以下である必要があります。")

    # メールアドレスチェック(簡易的な例)
    if not re.match(r"[^@]+@[^@]+\.[^@]+", email):
        errors.append("無効なメールアドレス形式です。")

    # パスワード強度チェック
    if len(password) < 8:
        errors.append("パスワードは8文字以上である必要があります。")
    elif not any(c.isupper() for c in password):
        errors.append("パスワードには少なくとも1つの大文字を含む必要があります。")
    elif not any(c.islower() for c in password):
        errors.append("パスワードには少なくとも1つの小文字を含む必要があります。")
    elif not any(c.isdigit() for c in password):
        errors.append("パスワードには少なくとも1つの数字を含む必要があります。")

    return errors if errors else "すべてのデータが有効です。"

# テストケース
print(validate_user_data(25, "user@example.com", "StrongPass1"))
print(validate_user_data(15, "invalid_email", "weakpass"))

実行結果

すべてのデータが有効です。
['年齢は18歳以上120歳以下である必要があります。', '無効なメールアドレス形式です。', 'パスワードには少なくとも1つの大文字を含む必要があります。']

このコードでは、比較演算子を使って年齢の範囲チェックを行い、正規表現と組み合わせてメールアドレスの形式を確認しています。

パスワードの強度チェックでは、長さの比較と文字種別の確認を行っています。

○サンプルコード12:成績評価プログラム

学生の点数を受け取り、それに応じた成績評価を行うプログラムを作成します。

比較演算子を使って点数の範囲を判定し、適切な評価を返します。

def grade_student(score):
    if not (0 <= score <= 100):
        return "無効な点数です。0から100の間で入力してください。"
    elif score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "F"

# 複数の学生の成績を評価
students = [
    {"name": "Alice", "score": 95},
    {"name": "Bob", "score": 82},
    {"name": "Charlie", "score": 78},
    {"name": "David", "score": 65},
    {"name": "Eve", "score": 55},
]

for student in students:
    grade = grade_student(student["score"])
    print(f"{student['name']}の成績: {grade} (点数: {student['score']})")

実行結果

Aliceの成績: A (点数: 95)
Bobの成績: B (点数: 82)
Charlieの成績: C (点数: 78)
Davidの成績: D (点数: 65)
Eveの成績: F (点数: 55)

このプログラムでは、比較演算子を使って点数の範囲を細かく区分し、それぞれに対応する成績評価を行っています。

elifを使用することで、複数の条件を効率的に処理しています。

○サンプルコード13:在庫管理システム

小売店の在庫管理システムを想定し、商品の在庫状況に応じて適切なアクションを提案するプログラムを作成します。

比較演算子を使って在庫レベルを判断し、必要な処理を行います。

class Product:
    def __init__(self, name, quantity, reorder_point, max_stock):
        self.name = name
        self.quantity = quantity
        self.reorder_point = reorder_point
        self.max_stock = max_stock

def check_inventory(product):
    if product.quantity <= 0:
        return f"【緊急】{product.name}の在庫が切れています。直ちに発注してください。"
    elif product.quantity <= product.reorder_point:
        reorder_amount = product.max_stock - product.quantity
        return f"【警告】{product.name}の在庫が少なくなっています。{reorder_amount}個の追加発注を推奨します。"
    elif product.quantity > product.max_stock:
        excess = product.quantity - product.max_stock
        return f"【注意】{product.name}の在庫が過剰です。{excess}個の削減を検討してください。"
    else:
        return f"{product.name}の在庫は適正水準です。"

# 商品リスト
products = [
    Product("りんご", 5, 10, 50),
    Product("バナナ", 0, 15, 60),
    Product("オレンジ", 30, 20, 40),
    Product("ぶどう", 70, 25, 55),
]

# 在庫チェック
for product in products:
    print(check_inventory(product))

実行結果

【警告】りんごの在庫が少なくなっています。45個の追加発注を推奨します。
【緊急】バナナの在庫が切れています。直ちに発注してください。
オレンジの在庫は適正水準です。
【注意】ぶどうの在庫が過剰です。15個の削減を検討してください。

この在庫管理システムでは、比較演算子を使って各商品の在庫状況を判断し、適切なアクションを提案しています。

<=>などの演算子を使い分けることで、異なる在庫レベルに対して柔軟に対応できるシステムを構築しています。

○サンプルコード14:ユーザー認証システム

最後に、比較演算子を活用したユーザー認証システムを作成します。

このシステムでは、ユーザー名とパスワードの照合、アカウントのロック機能、パスワードの有効期限チェックなどを実装します。

from datetime import datetime, timedelta

class User:
    def __init__(self, username, password, last_password_change):
        self.username = username
        self.password = password
        self.last_password_change = last_password_change
        self.login_attempts = 0
        self.is_locked = False

def authenticate(user, input_username, input_password):
    if user.is_locked:
        return "アカウントがロックされています。管理者に連絡してください。"

    if user.username != input_username or user.password != input_password:
        user.login_attempts += 1
        if user.login_attempts >= 3:
            user.is_locked = True
            return "ログイン失敗が3回を超えました。アカウントをロックします。"
        return "ユーザー名またはパスワードが間違っています。"

    user.login_attempts = 0  # 成功時にリセット

    # パスワード有効期限チェック(90日)
    if datetime.now() - user.last_password_change > timedelta(days=90):
        return "ログインに成功しましたが、パスワードの有効期限が切れています。更新してください。"

    return "ログインに成功しました。"

# テストユーザー作成
test_user = User("testuser", "password123", datetime.now() - timedelta(days=100))

# 認証テスト
print(authenticate(test_user, "testuser", "password123"))
print(authenticate(test_user, "testuser", "wrongpassword"))
print(authenticate(test_user, "testuser", "wrongpassword"))
print(authenticate(test_user, "testuser", "wrongpassword"))
print(authenticate(test_user, "testuser", "password123"))

実行結果

ログインに成功しましたが、パスワードの有効期限が切れています。更新してください。
ユーザー名またはパスワードが間違っています。
ユーザー名またはパスワードが間違っています。
ログイン失敗が3回を超えました。アカウントをロックします。
アカウントがロックされています。管理者に連絡してください。

このユーザー認証システムでは、比較演算子を様々な場面で活用しています。

ユーザー名とパスワードの照合には!=演算子を使用し、不一致の場合はエラーメッセージを返します。

ログイン試行回数のチェックには>=演算子を使い、3回以上の失敗でアカウントをロックします。

パスワードの有効期限チェックでは、>演算子を使って現在の日付と最後のパスワード変更日の差を90日と比較しています。

is_lockedフラグをチェックする際には、暗黙的に==演算子が使用されています。

この例では、比較演算子を使って複数の条件を組み合わせることで、セキュアで柔軟性の高い認証システムを実現しています。

実際の運用では、パスワードのハッシュ化やより複雑なセキュリティ対策が必要になりますが、基本的な構造はこのようになります。

まとめ

本記事では、Python比較演算子の基礎から応用まで、幅広くカバーしました。

比較演算子は、単純な値の比較から複雑な条件分岐、データ検証、ユーザー認証まで、プログラミングの様々な場面で活躍します。

比較演算子は、適切に使いこなすことで、効率的で読みやすく、堅牢なコードを書くことができます。

本記事で学んだ技術を活用し、より良いPythonプログラムを書く参考としていただければ幸いです。