andとor

よく文法の説明には、andとorの論理演算子はこんな感じに書かれています。

 真 and 真 -> 真
 真 and 偽 -> 偽
 偽 and 真 -> 偽
 偽 and 偽 -> 偽

 真 or  真 -> 真
 真 or  偽 -> 真
 偽 or  真 -> 真
 偽 or  偽 -> 偽

ただこれは、ブーリアン代数のandとorの説明であれば合っているのですが、Pythonの論理演算子andとorの説明としては少し間違っています。

and演算子というのは、左辺が偽のとき右辺は(真か偽か分からなくてもよいので)実行しません。同様にor演算子も、左辺が真のとき右辺は実行しません。

さらに、andもorも実行された値をそのまま返します。TrueやFalseを返すわけではありません(TrueやFalseを返すのは比較演算子です)。

つまり、実際にはこんな感じです。

 x【真】 and y   -> y
 x【偽】 and ... -> x

 x【真】 or  ... -> x
 x【偽】 or  y   -> y

このような性質があるからこそ、三項演算子のような使い方ができることになります。

 x == 0 and float('inf') or 1 / x

 # True and float('inf')  -> float('inf')
 # float('inf') or ...    -> float('inf')

 # False and ...          -> False
 # False or 1 / x         -> 1 / x