連鎖比較
連鎖比較 とは
a < x < bのように比較を連結して範囲判定を書きます。本レッスンでは、連鎖比較 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
連鎖比較で範囲を直感的に書く
連鎖比較とは、a < x < b のように比較演算子を 2 つ以上連結して書ける Python 独自の便利な構文です。これは数学の不等式そのままの書き方で、「x が a より大きく b より小さい」を 1 行で表現できます。多くのプログラミング言語では a < x and x < b のように and で連結する必要がありますが、Python はこの直感的な記法をサポートしている数少ない言語です。
連鎖比較は読みやすさが圧倒的です。たとえば「点数が 60 点以上 80 点未満」をチェックするなら 60 <= score < 80 のように、まるで数学の答案を書くように条件を表現できます。範囲判定が頻出する成績判定、年齢制限、座標範囲チェックなどで大活躍します。
連鎖比較は数学の不等号と同じ感覚で書ける
Pythonの特権です。可読性が大きく上がるので積極的に活用しましょう。
基本的な使い方
連鎖比較は、a op1 b op2 c のように演算子を 2 つ並べる構文です。内部的には a op1 b and b op2 c と展開され、それぞれの条件が同時に成立するかを判定します。次のとおりです。
Python
x = 50
print(0 <= x <= 100) # True
print(0 < x < 100) # True
print(0 == x == 0) # False (x は 50 なので)
age = 20
print(18 <= age < 65) # True (働き盛り)連鎖比較は 3 段以上にすることもできます。たとえば a < b < c < d と書けば「4 つの値が昇順に並んでいるか」を 1 行で判定できます。これは並び順チェックなどに便利です。
Python
print(1 < 2 < 3 < 4) # True
print(1 < 3 < 2 < 4) # False (3 と 2 で逆転)連鎖比較は短絡評価されます。最初の比較が
Falseなら、後続の比較は実行されません。
連鎖比較が便利なケース
連鎖比較は、特に範囲を扱う場面で力を発揮します。if 0 <= idx < len(arr): のように書けば、配列の境界チェックがとても自然に書けます。これを and で書くと if 0 <= idx and idx < len(arr): となり、idx を 2 回書く必要があるため少し冗長です。
Python
arr = [10, 20, 30]
idx = 2
if 0 <= idx < len(arr):
value = arr[idx]
else:
value = None
print(value) # 30また、連鎖比較は == や != も使えます。a == b == c で「3 つすべてが等しい」を判定できますし、a is b is c で同一性チェックも 3 段に連結できます。ただし a != b != c は「隣り合う 2 つが違う」だけを判定するので a と c が等しい可能性が残る点に注意が必要です。
よくある間違い
連鎖比較でつまずきやすいのは次の 3 点です。1 つめは Python 以外の言語の感覚で if 0 < x < 100 を書いた結果、他言語に移植したとき意図しない挙動になるケースです。2 つめは a != b != c で「3 つすべてが異なる」と勘違いするケースで、実際には a と c が等しい場合もあります。3 つめは、連鎖比較を and の代わりに使えると思って 0 < x or x < 100 のように or で連結してしまうケースで、これは連鎖比較ではない別の式です。
Python
# NG (常に True、x が何でも 100 未満か 0 より大きいかになる)
x = 200
print(0 < x or x < 100) # True (これは連鎖比較ではない)
# OK (範囲判定)
print(0 < x < 100) # False連鎖比較は
andを内包した便利な記法です。orを絡めたいときは普通の論理演算子で書く必要があります。
やってみよう
今回の課題は、整数 x が low 以上 high 以下に収まっているかを判定する関数 in_range(x, low, high) を、連鎖比較を使って書くことです。中身は return low <= x <= high の 1 行で済みます。書けたら、low と high が逆転している場合の挙動も確認してみてください。たとえば in_range(5, 10, 1) を呼ぶと連鎖比較は False を返します。範囲指定の前提として low <= high であることを呼び出し側で保証する設計にするのが一般的です。応用として、open closed half-open (開区間・閉区間・半開区間) の違いを意識して < と <= を使い分ける練習をすると、API 設計力が一段アップします。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は 剰余で偶数判定 で、a < x < b のように比較を連結して範囲判定を書きます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 連鎖比較 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 連鎖比較 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 連鎖比較 a <= x <= b を使う
- and を明示的に書かない
- 1 行で書ける
入出力例
test-cases.txt
in_range(5, 1, 10) → true
in_range(1, 1, 10) → true
in_range(10, 1, 10) → true
in_range(0, 1, 10) → false
in_range(11, 1, 10) → false
in_range(5, 10, 1) → false