Pythonの論理演算子and、or、notの応用についてです。1行に複数回使う時の方法とそれの意味について調べました。
論理演算子and、not(or、not)を1行に複数回使う時の方法とそれの意味については以下の記事をご覧ください。
▼関連記事:【Python3】論理演算子and、orを複数回使った時の使い方と優先順位
▼関連記事:【Python3】論理演算子and、notを複数回使う時の使い方と意味
▼関連記事:【Python3】論理演算子and、notを複数回使う時の使い方と意味
(独学プログラマー P.34 日経BP社発行より)
演算子 意味 例 評価結果 and かつ True and True True or あるいは True or False True not 否定 not True False
論理演算子and、or、notも比較演算子同様、TrueもしくはFalseを返します。 詳細は基礎編の記事をご参照ください。

論理演算子and、or、notを複数回使った例の前に…
本題に入る前にそれぞれの論理演算子について簡単に説明します。
論理演算子andを複数回使った時
andの左右の式が共にTrueの時のみTrueを返します。左右の式のどちらかがFalse、もしくは左右の式の両方がFalseの時はFalseを返します。
これを基本として、andのみを複数回使った時は、左から順番に真偽(真:True、偽:False)を判定していき、最終的な判定結果(出力結果)を出します。
論理演算子orを複数回使った時の例
論理演算子orは全ての式がTrueもしくは、いずれかの式がTrueの時はTrueを返します。また、全ての式がFalseの時はFalseを返します。
これを基本として、orのみを複数回使った時は、左から順番に真偽(真:True、偽:False)を判定していき、最終的な判定結果(出力結果)を出します。
論理演算子notを複数回使った時
基本的な考え方は「演算子notの後ろの式がTrueの場合、Falseを返す。演算子notの後ろの式がFalseの場合、Trueを返す。」となります。これは演算子notを複数回使った場合も同じで、演算子notを使った各式について上記の条件(TrueがFalseに、FalseがTrueになる事)を用いればOKです。
では、ここまでの話を元に本題へと進めていきましょう。
論理演算子and、or、notをそれぞれ1回組み合わせる場合
論理演算子and、or、notが同じ行にある場合、どれから優先して計算されるのでしょうか。Pythonでは優先順位が決まっており、not → and →orの順番で計算されると決まっています。
下記の例では、andとorを組み合わせて出力させてみました。また、例ごとにorとandの順番を入れ替えて出力させました。
or、andの順番の場合
例1
print(2 > 2 or 2 == 2 and 2 >= 2)
【出力結果】
Trueまずは次のように(1)と(2)に分けて考えます。orよりandを先に計算しないといけないので、andの部分が(1)に、orの部分を(2)にしています。

では、(1)から計算していきましょう。2 == 2はTrue、2 >= 2はTrueなので、(1)はTrueを返します。その為、例1は次のようになります。

続いて、(2)について計算していきます。orの左側の2 > 2なのでFalseが返ります。また、右側はTrueなので、(2)はTrueが返ります。よって、全体の評価結果(出力結果)もTrueが返ります。
例1にnotを入れた場合
続いて、例1の各行にnotを入れた例を見てみましょう。
例2
print(2 > 2 or not 2 == 2 and 2 >= 2)
【出力結果】
False今度はFalseが出力されました。これも先程と同様に、分けて順番に考えます。優先順位はnot → and→ orの順に計算していきます。そのため、例2は次のように(1):not、(2):and、(3):orに分けて、順番に計算します。

まず、(1)から計算していきましょう。2 == 2は本来であればTrueを返します。しかし、今回はnotがついているので、(1)はFalseを返します。その為、例2は次のようになります。

続いて、(2)について見て行きましょう。演算子andの左側はFalse、右側は2 >= 2なのでTrueを返します。その為、(2)はFalseを返します。よって、例2は次のようになります。

最後に(3)について見て行きます。演算子orの左側は2 > 2なのでFalse、右側はFalseです。その為、(3)はFalseを返します。よって、例2の全体の評価結果(出力結果)もFalseを返します。
and、orの順番の場合
例3
print(2 == 2 and 2 >= 3 or 2 > 2)
【出力結果】
Falseまずは次のように(1)と(2)に分けて考えます。orよりandを先に計算しないといけないので、andの部分が(1)に、orの部分を(2)にしています。

(1)から計算していきます。andの左側の2 == 2はTrue、右側の2 >= 3はFalseなので、(1)はFalseを返します。その為、例3は次のようになります。

続いて、(2)について計算します。演算子orの左側はFalse、右側は2 > 2なのでFalseを返します。その為、(2)はFalseを返します。よって、例3の全体の評価結果(出力結果)もFalseを返します。
例3にnotを入れた場合
例3にもnotを1つ入れて検証してみましょう。
例4
print(2 == 2 and not 2 >= 3 or 2 > 2)
【出力結果】
True今度は2行目がTrueに変わりました。これも先程と同様に、分けて順番に考えます。優先順位はnot → and→ orの順です。そのため、例4は次のように(1):not、(2):and、(3):orに分けて、順番に計算します。

まずは(1)から見て行きます。2 >= 3は本来であれば、Falseを返しますが、notがついているので、(1)はTrueを返します。その為、例4は次のようになります。

続いて、(2)について計算します。演算子andの左側の2 == 2はTrueを返し、右側はTrueなので、(2)はTrueを返します。よって例4は次のようになります。

最後に(3)について計算します。演算子orの左側はTrue、右側の2 > 2はFalseなので、(3)はTrueを返します。よって例4の全体の評価結果(出力結果)はTrueを返します。
andを2回以上とorを組み合わせた場合
この場合も優先順位はnot →and → orの順番である事は変わりません。ただし、andが2つ以上あれば、andのうち左側のandから計算されます。では、実際に例をみていきましょう。
例5
print(2 > 2 or 2 != 2 and 2 >= 2 and 2 == 2)
【出力結果】
Falseこの場合も優先順位はnot → and → orの順番である事は変わりません。andが2つありますが、andは左側のandから計算していきます。これまでと同様、例5を次のように分けて考えます。

まずは、(1)から計算していきます。2 != 2はFalse、2 >= 2はTrueなので、(1)はFalseを返します。その為、例5は次のようになります。

つづいて、(2)について計算していきます。演算子andの左側はFalse、右側は2 == 2なのでTrueが返ります。その為、(2)はFalseを返します。よって、例5は次のようになります。

最後に、(3)について計算します。演算子orの左側は2 > 2なのでFalse、右側はFalseなので、(3)はFalseを返します。よって、例5の全体の評価結果(出力結果)もFalseを返します。
andを2回以上とorとnotを組み合わせた場合
例5の例にnotを入れた場合を検証していきましょう。
例6
print(not 2 > 2 or 2 != 2 and 2 >= 2 and 2 == 2)
【出力結果】
Trueこれまで同様、次のように計算する優先順位((1)~(4))をつけて、順に見て行きます。優先順位はnot → and → orです。andが2つありますが、左側のandから計算します。

まず(1)から計算します。2 > 2はFalseですが、notがついているので、反対のTrueが返ります。その為、例6は次のようになります。

続いて(2)を計算します。演算子andの左側は2 != 2なのでFalse、右側は2 >= 2なのでTrueが返ります。その為、(2)は、Falseが返ります。よって、例6は次のようになります。

次に(3)を計算します。演算子andの左側はFalseで、右側は2 == 2なのでTrueが返ります。その為、(3)はFalseが返ります。よって、例6は次のようになります。

最後に(4)について計算します。演算子orの左側はTrue、右側はFalseなので、(4)はTrueを返します。よって、例6も全体の評価結果(出力結果)はTrueを返します。

コメント