連鎖比較

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

連鎖比較 とは

a < x < b のように比較を連結して範囲判定を書きます。本レッスンでは、連鎖比較 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

連鎖比較で範囲を直感的に書く

連鎖比較とは、a < x < b のように比較演算子を 2 つ以上連結して書ける Python 独自の便利な構文です。これは数学の不等式そのままの書き方で、「xa より大きく 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 で逆転)
diagram (will load when visible)

連鎖比較は短絡評価されます。最初の比較が 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 つが違う」だけを判定するので ac が等しい可能性が残る点に注意が必要です。

よくある間違い

連鎖比較でつまずきやすいのは次の 3 点です。1 つめは Python 以外の言語の感覚で if 0 < x < 100 を書いた結果、他言語に移植したとき意図しない挙動になるケースです。2 つめは a != b != c で「3 つすべてが異なる」と勘違いするケースで、実際には ac が等しい場合もあります。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 を絡めたいときは普通の論理演算子で書く必要があります。

やってみよう

今回の課題は、整数 xlow 以上 high 以下に収まっているかを判定する関数 in_range(x, low, high) を、連鎖比較を使って書くことです。中身は return low <= x <= high の 1 行で済みます。書けたら、lowhigh が逆転している場合の挙動も確認してみてください。たとえば 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 つができることを確認しましょう。

  1. 連鎖比較 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 連鎖比較 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 連鎖比較 a <= x <= b を使う
  2. and を明示的に書かない
  3. 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

ヒント

main.py
main.py
学習モード

メモ

連鎖比較

⌘S で保存