Pythonでプログラムを書く際、「ある値が特定の範囲内にあるか」を判定したいことがよくあります。例えば、「スコアが80点以上、かつ100点未満」といった条件です。
多くのプログラミング言語では、これを and 演算子を使って (80 <= score) and (score < 100) のように記述する必要があります。
しかし、Pythonでは、数学の表記と同じように 80 <= score < 100 と連鎖させて書くことができます。この記事では、この便利で可読性の高い「連鎖比較演算子」について解説します。
連鎖比較の基本的な使い方
連鎖比較は、複数の比較演算子(<, >, <=, >=, ==, !=)を続けて記述する構文です。
これは、and で結合された複数の比較として自動的に解釈されます。
a < b < cは(a < b) and (b < c)と等価です。a <= b < cは(a <= b) and (b < c)と等価です。
1. 数値の範囲チェック
連鎖比較が最もよく使われるのは、数値が特定の範囲内にあるかどうかの判定です。
def get_grade(score):
"""
点数に応じて評価を返す
"""
# 80点以上、かつ100点以下
if 80 <= score <= 100:
return "優"
# 60点以上、かつ80点未満
elif 60 <= score < 80:
return "良"
# 0点以上、かつ60点未満
elif 0 <= score < 60:
return "可"
else:
return "範囲外"
# 実行
print(f"95点: {get_grade(95)}")
print(f"70点: {get_grade(70)}")
print(f"40点: {get_grade(40)}")
実行結果:
95点: 優
70点: 良
40点: 可
2. and を使った場合との比較
もし連鎖比較を使わずに and で記述すると、以下のようになります。
# 'and' を使った記述(動作は同じだが、冗長)
if (60 <= score) and (score < 80):
return "良"
60 <= score < 80 と書くほうが、score という変数を2回書く必要がなく、直感的で読みやすいことがわかります。
複数の異なる演算子の組み合わせ
連鎖比較では、異なる種類の比較演算子を組み合わせることも可能です。== や != も含めることができます。
a = 10
b = 20
c = 20
# (a < b) かつ (b == c) か?
check1 = (a < b == c)
print(f"a < b == c : {check1}") # True
# ---
x = 5
y = 5
z = 10
# (x == y) かつ (y < z) か?
check2 = (x == y < z)
print(f"x == y < z : {check2}") # True
実行結果:
a < b == c : True
x == y < z : True
注意点
この構文は、a < b と b < c が評価される際、b が2回評価されるわけではありません。Pythonは a < b をまず評価し、それが True であった場合にのみ b < c の評価に進みます(短絡評価)。
まとめ
- Pythonでは、
a < b < cのように比較演算子を連鎖させて記述できます。 - これは
(a < b) and (b < c)と自動的に解釈されます。 80 <= score < 100のように、数値の範囲を判定するif文などで使用すると、コードの可読性が大幅に向上します。
