pythonの論理式が真偽値以外も返す話
論理式が真偽値以外の結果を返却してくる不思議な構文のお話です。
何が入っているでしょう?
早速ですが、次のプログラムを実行したときvalue
には何が入っているでしょう?
value = False or True
正解
正解はTrue
です。
何が入っているでしょう?(2)
先ほどのは簡単だと思いますが、次はどうでしょう?
value = 0 or 1
ヒント
Pythonで数値は、0
はFalse
、1
はTrue
として評価されます。
正解
正解は、1
です。
True
が入ると思った方もいるとは思いますが、Pythonではand
やor
の式は真偽値ではなく、真偽値として評価したときに条件を満たす値を返すという仕様になっているらしいのです。
流れとしては、上の式ではまず0
が評価されます。0
はFalse
として評価されるので次の値が評価されます。0
の次は1
が評価されます。1
はTrue
として評価されるので、1
がa
に代入されます。
では、and
の場合はどうなるでしょうか?
value = 0 and 1
# 0
ちょうどor
の逆の挙動です。
value = 0 or 2 and 3
こんな具合に複数 連ねることもできます。
この場合value
に入っているのは3
です。
短絡評価(ショートサーキット)
Pythonでand
やor
を使うときに注意が必要なのは短絡評価(ショートサーキット)が行われることです。
ここでいう短絡評価というのは、左から順に値を確認していき、条件を満たさないことが確定したらそれより先の条件を評価しない、ということです。
具体的に、引数をprintしてreturnするだけの関数、print_and_return
を使って確認してみます。
def print_and_return(value):
print(value)
return value
a = print_and_return(True) or print_and_return(False) or print_and_return(True)
# True
実行してみると、表示されるのがTrue
が一回だけなのがわかると思います。
この場合、一番最初にprint_and_return
を実行した段階でor
式全体の結果がTrue
なのが確定するので、それより先の式が評価されず、結果True
が一回だけ表示されたということです。
上の例ではprint
するだけでしたが、数値計算が絡むようなプログラムを、このことを知らずに組むと、思わぬところでバグを生み出すことになるので気をつけましょう。
まとめ
- Pythonの条件式は真偽値を返すとは限らない
- 短絡評価には気をつけよう