pythonの比較演算の不思議な挙動
三項を利用した比較演算
pythonで以下の比較演算の結果はどうなると思いますか?
a = 12
b = 12.5
c = True
a > b == c
これは多くの皆さんの予想通りの結果になると思います。
そうです、False
です。
12が12.5より大きいわけはないので当然の結果です。
では、続いて以下の演算の結果はどうなるでしょうか?
a < b == c
こちらは予想を裏切られる方が多かったのではないかと思います。
こちらもFalse
が返ってきます。
なぜ、この様な結果になるのか?
予想を裏切られた人の多くは次の様に考えたのではないかと思います。
a < b
の比較演算を実行する- 1の結果と
c
が等しいかどうか判断する - 2の結果 等しいので
True
が返る
ご存知方も多いと思いますが、pythonは三項を利用した以下の様な比較ができます。
a < b < c
範囲比較は便利なので普段から利用する人も多いでしょう。
この比較演算ではa
はb
より大きく、かつ、b
はc
より大きいときにTrue
を返します。
先ほどの比較演算もこれと同様、a
はb
より大きく、かつ、b
がc
と等しいときに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