Python | 文法の基本:比較演算子

Python
スポンサーリンク

比較演算子の概要

Pythonの比較演算子は、2つの値を比べて結果を真偽値(True/False)で返します。基本は「等しい(==)」「等しくない(!=)」「より小さい(<)」「より大きい(>)」「以下(<=)」「以上(>=)」です。if文やwhile文の条件式で頻出し、動作の分岐を決める土台になります。比較の結果は必ず bool 型になり、論理演算(and, or, not)と組み合わせて複雑な条件を構成できます。


基本の比較とよくあるパターン

数値と文字列の比較の基本

数値の大小比較は直感的に使えます。文字列は「辞書順(Unicodeコードポイントの順)」で比較されるため、アルファベットでは通常、’A’ < ‘a’ のような大小関係が生まれます。日本語も内部的にはUnicodeの順で比較されるので、文化的な「ソート順」とは異なることがあります。

# 数値
print(5 > 3)       # True
print(10 == 10)    # True
print(7 <= 6)      # False

# 文字列(辞書順)
print("apple" < "banana")  # True
print("Z" < "a")           # True(コードポイント順)
Python

異なる「順序付け不可能」な型(例: 数値とリスト)を大小比較すると TypeError になります。等価(==)は多くの異種型で比較できますが、意味のある比較かどうかはケースバイケースです。


重要な違い:== と is、None の扱い(深掘り)

値の等価(==)と同一性(is)

  • == は「値が等しいか」を判定します。
  • is は「同じオブジェクトか(同一の実体)」を判定します。
a = [1, 2]
b = [1, 2]
c = a
print(a == b)  # True(値が等しい)
print(a is b)  # False(別オブジェクト)
print(a is c)  # True(同一オブジェクト)
Python

None と比較するときは is を使うのが慣例です。None は「値なし」を表す唯一のオブジェクトなので、同一性で判定するのが明確です。

value = None
print(value is None)   # True
print(value == None)   # 使えはするが is が推奨
Python

浮動小数点の比較と丸め誤差(ここが重要)

直接比較の落とし穴と安全な比較

float は近似表現なので、期待どおりに一致しないことがあります。直接比較(==)ではなく「許容誤差」を使って判定するか、math.isclose を使うのが安全です。

x = 0.1 + 0.2
print(x == 0.3)  # False になり得る

import math
print(math.isclose(x, 0.3, rel_tol=1e-9, abs_tol=0.0))  # True
Python

NaN(float(‘nan’))は「何とも比較できない」特殊値で、NaN == NaN が False になります。isnan で判定しましょう。

import math
n = float('nan')
print(n == n)           # False
print(math.isnan(n))    # True
Python

連鎖比較と組み合わせ(Pythonらしい書き方)

連鎖比較で範囲を読みやすく書く

Pythonは比較を連鎖できます。数学の書き方に近く、可読性が高いのが利点です。

score = 85
print(70 <= score < 90)  # True(70以上かつ90未満)
Python

連鎖比較は「両端まで」すべて評価され、短絡的に誤判定することはありません。複数の条件を and でつなぐより、範囲判定は連鎖比較で表現する方が意図が伝わります。


コレクションやタプルの比較、順序の意味

タプル・リストの「辞書式(レキシカル)比較」

タプルやリストは「先頭から順に」対応する要素を比較します。最初に大小が決まった時点で結果が決まります。型混在や比較不能な要素があると、大小比較は TypeError になります。

print((1, 2, 3) < (1, 3, 0))  # True(2 < 3 の時点で決まる)
print([1, 2] < [1, 2, 0])     # True(長さではなく要素比較、先頭一致→次要素へ)
Python

等価(==)は「全要素が等しいか」を比較します。大規模データ構造の等価比較ではコスト(時間)がかかる点も意識しましょう。


実用例題(初心者向けに要点を体験)

例題1:会員割引の条件(==、>= と and)

def can_discount(member_type: str, years: int) -> bool:
    # ゴールド会員、または一般会員でも在籍年数が3年以上
    return member_type == "gold" or (member_type == "general" and years >= 3)

print(can_discount("gold", 1))     # True
print(can_discount("general", 2))  # False
print(can_discount("general", 3))  # True
Python

例題2:入力の範囲チェック(連鎖比較)

age = 17
if 13 <= age < 18:
    print("ティーン")  # 13〜17
else:
    print("それ以外")
Python

例題3:文字列の安全な一致(正規化して比較)

raw = "  PyThOn  "
norm = raw.strip().casefold()
print(norm == "python")  # True(前後空白と大小文字の揺れを除去)
Python

例題4:浮動小数のしきい値判定(isclose)

import math

def is_over_threshold(value: float, threshold: float) -> bool:
    return (value > threshold) or math.isclose(value, threshold, rel_tol=1e-9)

print(is_over_threshold(0.1 + 0.2, 0.3))  # True
Python

まとめ

比較演算子は、条件分岐の核です。== と is の違い、None は is で判定、文字列は辞書順、コレクションは辞書式比較、float は誤差前提で isclose を使う——この軸を押さえると、現場の判定ロジックが格段に安定します。範囲は連鎖比較で簡潔に、異種型の大小比較は避ける、NaN は isnan で扱う。迷いどころを先回りしてルール化すると、読みやすく正確な条件式を書けます。

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