比較演算子の概要
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(同一オブジェクト)
PythonNone と比較するときは 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
PythonNaN(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 で扱う。迷いどころを先回りしてルール化すると、読みやすく正確な条件式を書けます。
