Pythonにおける比較演算子の連鎖(チェーン)の使い方を徹底解説
プログラミングをしていると、1つの条件式の中で複数の条件を同時にチェックしたい場面がよくあります。例えば「x < y < z」のような数学的な記法を使いたい場合や、「x < y かつ x < z」といった形で条件を組み合わせたい場合などです。
他の多くの言語と同様に、Pythonにも基本的な比較演算子が用意されています。具体的には、<、<=、>、>=、==、!=、is、is not、in、not in の各演算子です。
これらの比較演算子はすべて同じ優先順位を持っており、その優先順位は算術演算子・ビット演算子・シフト演算子よりも低く設定されています。
比較演算子の連鎖とは
Pythonの大きな特徴のひとつが、比較演算子を任意に連結(チェーン)できる点です。たとえば「x < y < z」という式は、「x < y and y < z」と記述した場合と完全に同じ意味になります。
一般化して考えると、オペランドが p1, p2, ..., pn、演算子が OP1, OP2, ..., OPn-1 のとき、連鎖した式は次のように評価されます。
p1 OP1 p2 and p2 OP2 p3 and ... and pn-1 OPn-1 pn
つまり、間にあるオペランドは左右両方の比較で共有されます。また、and による短絡評価と同様に、途中で False になった時点でそれ以降の式は評価されず、各部分式は最大でも1回しか評価されません。この仕組みのおかげで、数学の記法に近い自然な形で範囲チェックなどを書けるのがPythonの魅力です。
サンプルコード①:基本的な連鎖
a = 10 b = 20 c = 5 # c < a < b は c < a and a < b と同じ意味 print(c < a) print(a < b) print(c < a < b) # b は 40以上60以下 の範囲にはない print(40 <= b <= 60) # a は 10 であり、c より大きい print(a == 10 > c)
出力結果
True True True False True
「c < a < b」は c(5) < a(10) かつ a(10) < b(20) がどちらも成立するため True となります。一方、「40 <= b <= 60」は b が 20 なので範囲外となり False です。「a == 10 > c」は a == 10 が True、かつ 10 > c(5) が True なので True になります。
サンプルコード②:is 演算子との組み合わせ
u = 5 v = 10 w = 15 x = 0 y = 7 z = 15 # w は z と同一オブジェクトだが v とは異なる。 # さらに v は x より大きく、x は y より小さい print(z is w is not v > x < y) # w と z が同一で、x < z > y が成り立つかどうかを確認 print(x < w == z > y)
出力結果
True True
最初の式では「z is w」(同一オブジェクト)→ True、「w is not v」(異なるオブジェクト)→ True、「v > x」(10 > 0)→ True、「x < y」(0 < 7)→ True となり、全体として True が返されます。このように、is / is not を含む比較演算子も自由に連鎖させることができます。
まとめ
Pythonの比較演算子の連鎖を使うと、数値の範囲チェックなどを数学の記法そのままに、簡潔かつ読みやすく記述できます。ただし、可読性を保つためにも、あまり長い連鎖にせず、意図が明確になる範囲で使うことをおすすめします。
-
Pythonのオブジェクト比較を徹底解説:「is」と「==」演算子の違い
本記事では、Pythonにおけるオブジェクト比較の方法として、「is」演算子と等価演算子「==」の違いについて詳しく解説します。 この2つの演算子は似ているようで、実はまったく異なる役割を持っています。それぞれの動作の仕組みを正しく理解することは、バグの少ないPythonコードを書く上で非常に重要です。 「==」と「is」の基本的な違い 等価演算子(==)は、渡されたオブジェクトの値が等しいかどうかを判定します。つまり、2つのオブジェクトがメモリ上のどこに格納されていようと、中身の内容が同じであれば「等しい」とみなされます。 一方、is 演算子は、2つのオブジェクトが同一の参照(同じメモリ上の
-
Pythonで++や--演算子はどう動く?インクリメントができない理由と正しい代替方法
Pythonには++や--という演算子は存在しないC/C++やJavaなどの言語では、++と--はそれぞれ「1を加える」「1を引く」ためのインクリメント・デクリメント演算子として定義されています。しかし、Pythonではこれらは演算子として定義されていません。その理由はPythonの設計思想にあります。Pythonではすべてのオブジェクトがメモリ上に格納され、変数はそのオブジェクトを指す「名前(ラベル)」にすぎません。さらに、数値オブジェクトはイミュータブル(不変)であるため、後から値を直接書き換えることができません。このため、C言語スタイルのa++のような演算子は採用されていないのです。前置