pythonの比較演算の不思議な挙動

三項を利用した比較演算

pythonで以下の比較演算の結果はどうなると思いますか?

a = 12
b = 12.5
c = True

a > b == c

これは多くの皆さんの予想通りの結果になると思います。

そうです、Falseです。
12が12.5より大きいわけはないので当然の結果です。

では、続いて以下の演算の結果はどうなるでしょうか?

a < b == c

こちらは予想を裏切られる方が多かったのではないかと思います。

こちらもFalseが返ってきます。

なぜ、この様な結果になるのか?

予想を裏切られた人の多くは次の様に考えたのではないかと思います。

  1. a < bの比較演算を実行する
  2. 1の結果とcが等しいかどうか判断する
  3. 2の結果 等しいのでTrueが返る

ご存知方も多いと思いますが、pythonは三項を利用した以下の様な比較ができます。

a < b < c

範囲比較は便利なので普段から利用する人も多いでしょう。
この比較演算ではabより大きく、かつbcより大きいときにTrueを返します。

先ほどの比較演算もこれと同様、abより大きく、かつbcと等しいときにTrueを返します。

つまり先ほどの演算は

a < b and b == c

と意味的には等しくなります。

ただし、注意していただきたいのはandを利用した場合と違ってbが評価されるのは一度だけという点です。

なので、多くの皆さんの予想を裏切ってFalseという結果が返されたのです。

おまけ

pythonの比較演算は3つ以上の式を連続して並べることも可能です。

例えば、

a < b < c < d == e

といった書き方も可能です。

この場合、

a < b and b < c and c < d and d == e

と意味的には等価になります。

また、

a < b > c

といった書き方も出来ます。

数学的にはおかしいですが、pythonの式としては正当な文法で、

a < b and b > c

と意味的に等価になります。

まとめ

  • 比較演算は複数並べて書く事ができる
  • pythonの比較演算は数学っぽい評価の仕方をする
参考

https://docs.python.org/ja/3/reference/expressions.html#comparisons