Pythonの論理演算子and、notの応用についてです。1行に複数回使う時の方法とその意味について、まとめました。論理演算子or、notを1行に複数回使う時の方法とそれの意味については以下の記事をご覧ください。

論理演算子の種類、意味、例、評価結果は次のようになります。
演算子 意味 例 評価結果 and かつ True and True True or あるいは True or False True not 否定 not True False (独学プログラマーP.34 日経BP社発行より)
論理演算子and、or、notも比較演算子(リンク)同様、TrueもしくはFalseを返します。詳細は基礎編の記事をご参照ください。また、本記事では演算子notについてまとめています。演算子and、orは以下の記事にまとめていますので、ぜひご覧ください。

論理演算子notの基本的な形
順を追って徐々に複雑なコードを見て行きたいと思います。
まず始めは基本的な形から
print(not 2 > 2)
print(not 2 == 2)
'''
【出力結果】
True
False1行目は2は2より大きくないので、notがなければFalseが返ります。1行目ではnotがついているので、Falseの反対のTrueが返ります。
同様に2行目は2は2と等しいので、notがなければTrueが返ります。2行目ではnotがついているので、Trueの反対のFalseが返ります。
演算子andとnot(1回)が組み合わさった場合
andとnotの組み合わさった場合、次のように考えると混乱せずに済むと思います。
1)notがついた式のブール値(TrueとFalse)を逆に考える。
2)andの左右の式のブール値(TrueとFalse)により、全体のブール値を判断する。
(例:andの左右の式がTrueであれば、全体はTrueを返す。andの左右の式のどちらかがFalse、もしくは両方がFalseであれば、全体はFalseを返す。)
論理演算子andについては以下の記事で詳しく解説しています。

では、例を見て行きましょう。
print(2 > 2 and 2 == 2)
print(not 2 > 2 and 2 == 2)
print(2 > 2 and not 2 == 2)
'''
【出力結果】
False
True
False1行目
2は2より大きくないので、2>2はFalse、2は2と等しいので、2 == 2はTrueとなります。そのため、andの左右の式がFalseとTrueになるので、1行目全体ではFalseが返ります。
2行目
1行目の2>2に対してnotがついています。これにより、2>2は本来であればFalseが返りますが、notがつくことによってFalseの反対のTrueが返ります。また、2 == 2は2と2が等しいのでTrueが返ります。よって、andの左右の式がTrueなので、2行目全体としてTrueが返ります。
3行目
2>2は上記の通り、Falseが返ります。また、2 == 2はTrueですが、notがつくことによって反対のFalseが返ります。andの左右の式がFalseなので、3行目全体としてFalseが返ります。
演算子andとnotが複数回(not:2回)組み合わさった場合
演算子andにnotが2つついた場合も考え方は同じです。
1.notがついた式のブール値(TrueとFalse)を逆に考える。
2.andの左右の式のブール値(TrueとFalse)により、全体のブール値を判断する。
では、例を見て行きましょう
print(not 2 > 2 and not 2 == 2)
print(not 2 > 2 and not 2 != 2)
'''
【出力結果】
False
True1行目
2は2より大きくないので、2>2はFalseですが、notがついているのでTrueが返ります。また、2は2と等しいので、2 == 2はTrueですが、notがついているので、Falseが返ります。そのため、andの左右の式がFalseなので、1行目全体ではFalseが返ります。
2行目
2は2より大きくないので、2>2はFalseですが、notがついているのでTrueが返ります。また、2は2と等しいので、2 != 2はFalseですが、notがついているので、Trueが返ります。そのため、andの左右の式がTrueなので、2行目全体ではTrueが返ります。
演算子andとnotが複数回(and:2回、not:3回)組み合わさった場合
演算子andが2回にnotが3回でてくる場合も考え方は基本的に同じです。
1.notがついた式のブール値(TrueとFalse)を逆に考える。
2.andの左右の式のブール値(TrueとFalse)により、全体のブール値を判断する。
以下の例で徐々にコードを複雑にしていきます。まずはandを複数回使った形です。
例1
print(3 > 2 and 2 == 2 and 2 >= 2)
'''
【出力結果】
True3は2より大きいので、3 >2はTrue、2は2と等しいので、2 == 2はTrue、2は2以上なので2 >= 2はTrueとなります。よって全ての式がTrueなので、全体としてTrueが返ります。
続いて、例1にnotを1つ入れてみましょう。
例2
print(not 3 > 2 and 2 == 2 and 2 >= 2)
print(3 > 2 and not 2 == 2 and 2 >= 2)
print(3 > 2 and 2 == 2 and not 2 >= 2)
'''
【出力結果】
False
False
False例2の各行のコードはnotがなければ全てTrueが返るものでした。そこに1つnotが入ったので、どの行もどこかの比較はFalseが返ることになります。その為、どの行も全体としてFalseが返ることになります。
最後にもう1つだけ例を挙げておきます。
例3
print(2 != 2 and 2 > 2 and 2 == 2)
print(not 2 != 2 and not 2 > 2 and 2 == 2)
'''
【出力結果】
False
Trueまず、2行目のコードから見ていきます。2は2と等しいので、2 != 2はFalseになります。次に2は2より大きくないので、2 > 2もFalseになります。最後に、2は2と等しいので、2 == 2はTrueになります。よって、各式がFalse、False、Trueとなるので、2行目全体としてFalseが返ります。
次に、3行目では2行目でFalse、Falseの値を返していた式にnotがついています。それにより、Falseの反対のTrueを返します。よって、各式は前から順番にTrue、True、Trueの値を返しているので、3行目全体でもTrueを返すことになります。

コメント