ユーニックス総合研究所

  • home
  • archives
  • python-ronri-enzanshi

Pythonの論理演算子をマスターする【and, or, not】

  • 作成日: 2023-07-10
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonの論理演算子をマスターする

Pythonにおける論理演算子とは論理を扱う演算子です。
論理とはつまり「Aは真か? それとも偽か?」というようなロジックのことです。

論理演算子はif文をはじめとしてPythonのあらゆるシーンで使われます。
論理演算子をマスターすればPythonのスキルを上げることができるでしょう。

参考
6. 式 (expression) — Python 3.11.4 ドキュメント

関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する

and演算子(論理積)

and演算子は「AとBが共に真なら真」になる演算子です。
真というのはTrueのことです。ちなみに偽はFalseです。

print(True and True)  # True  
print(False and True)  # False  
print(False and False)  # False  

and演算子は左右の項のどちらかが偽なら偽になります。
True and Trueの場合は左右の項のどちらも真ですので結果は真になります。
False and Trueの場合は左の項が偽なので結果は偽になります。
ちなみにand演算子は必ずTrueまたはFalseを返すわけではなく、演算している値を返します。
つまり

print(1 and 1)  # 1  
print(0 and 1)  # 0  
print(0 and 0)  # 0  

上記のように演算の項が整数なら結果として整数を返すということです。
1TrueもPythonでは真として扱われます。
0Falseは偽として扱われます。

ですので文字列の場合も

print('a' and 'a')  # a  
print('' and 'a')  #   
print('' and '')  #  

という感じで文字列が結果になります。
この特性はor演算子でも同じです。

or演算子(論理和)

or演算子は「AとBのどちらかが真なら真」になる演算子です。

print(True or True)  # True  
print(False or True)  # True  
print(False or False)  # False  

上記の場合はTrue or Trueは両方Trueなのでどちから一方がTrueになっていて結果はTrueです。
False or Trueの場合は右の項がTrueなので結果はTrueです。
False or Falseは両方の項がFalseなので結果はFalseです。

これも結果は演算に使われた値を返します。

print(1 or 2)  # 1  
print(0 or 1)  # 1  
print(0 or 0)  # 0  

この演算の特性を利用して真の値を変数に格納するという芸当も可能です。

x = 1 or 0  
print(x)  # 1  

and演算とor演算の結果の返り値の定義

これは公式ドキュメントによると

式 x and y は、まず x を評価します; x が偽なら x の値を返します; それ以外の場合には、 y を評価した結果値を返します。
式 x or y は、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、 y を評価した結果値を返します。

6. 式 (expression) — Python 3.11.4 ドキュメント

ということになっています。

not演算子(否定)

not演算子は演算の結果を反転します。
つまりTrueFalseに、FalseTrueにします。

print(not True)  # False  
print(not False)  # True  
print(not 1)  # False  
print(not 0)  # True  

ちなみにnot演算子は結果を必ずbool値で返します。
上記を見るとnot 1の結果がbool値のFalseになってますよね。
この特性を利用して整数の値を真偽値に変換するという芸当も可能です。

print(not not 1)  # True  

上記の場合は1notFalseになり、それがnotTrueになります。
結果的に1Trueに変換することができています。
もっともこの変換をやるならboolクラスを使った方が簡単かもしれません。

print(bool(1))  # True  

論理演算子の優先順位

論理演算子の優先順位は

not > and > or  

で、notが一番優先度が高いです。
優先度を変更したい場合はカッコを使います。

and演算子とor演算子

それぞれの論理演算子は組み合わせることができます。
たとえばand演算子とor演算子は組み合わせることができます。

print(True and True or False)  # True  
print(True and False or False)  # False  
print(False and False or True)  # True  

しかしこれだと先にandが評価されるのかorが評価されるのかわかりづらいかと思います。
ですのでわかりやすくしたい時はカッコを付けます。

print((True and True) or False)  # True  
print((True and False) or False)  # False  
print(False and (False or True))  # False  

カッコを付けるとカッコの演算子が先に評価されます。

and演算子とnot演算子

and演算子とnot演算子を組み合わせることも出来ます。

print(not (1 and 1))  # False  
print(not (1 and 0))  # True  

上記の場合はnot (1 and 1)ですがこれは(1 and 1)が真になり、それがnotで反転するので結果は偽(False)です。
not (1 and 0)の場合ですが、これは(1 and 0)が偽になり、それがnotで反転するので結果は真(True)です。

or演算子とnot演算子

or演算子とnot演算子も組み合わせられます。

print(not (1 or 0))  # False  
print(not (0 or 0))  # True  

上記の場合はnot (1 or 0)ですがこれは(1 or 0)は結果が真です。それがnotで反転して偽(False)になります。
not (0 or 0)の場合は、(0 or 0)は結果が偽です。これがnotで反転して真(True)になります。

if文と論理演算子

論理演算子はif文と合わせて使うことができます。

if True and True:  
    print('真')  

if True and False:  
    pass  
else:  
    print('偽')  

if True or False:  
    print('真')  

if False or False:  
    pass  
else:  
    print('偽')  

if not 0:  
    print('真')  

if not 1:  
    pass  
else:  
    print('偽')  

論理演算子の実用例

論理演算子は実際には比較演算子と一緒によく使われます。

print(1 < 2 and 2 > 1)  # True  
print(1 < 2 or 2 < 1)  # True  

論理演算子と比較演算子では比較演算子の方が優先度が高いです。
ですので上記のように書くことができます。
上記の場合は1 < 22 > 1andより先に評価されます。

色々なオブジェクトと論理演算子

Pythonにはいろいろなオブジェクトがありますが、これらは論理演算可能です。
そのオブジェクトがどういう風に評価されるかはboolクラスにオブジェクトを渡すとわかります。

print(bool(None))  # False  
print(bool(0))  # False  
print(bool(0.0))  # False  
print(bool(0j))  # False (複素数)  
print(bool(''))  # False  
print(bool(()))  # False  
print(bool([]))  # False  
print(bool(set()))  # False  
print(bool(range(0)))  # False  
print(bool({}))  # False  

上記のようにNone0、空オブジェクトはFalseになります。
これ以外はTrueです。

ショートサーキット(短絡評価)

たとえばx and yxが偽の時はyの評価は必要なく結果は偽になります。
こういう時はyが無視されることがあります。
ですので関数などを使う時は注意が必要です。関数が実行されることを期待しても実行されない可能性があるからです。

def aaa():  
    print('aaa')  
    return True  

def bbb():  
    print('bbb')  
    return False  


aaa() and bbb()  
# aaa  
# bbb  

bbb() and aaa()  
# bbb  

上記の場合はbbb() and aaa()bbb()Falseを返すのでaaa()は評価されず関数が実行されていません。

おわりに

今回はPythonの論理演算子を解説しました。
なにか参考になれば幸いです。

🦝 < 論理的に頼む

🦝 < 眠りのコゴロー