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
上記のように演算の項が整数なら結果として整数を返すということです。
1
もTrue
もPythonでは真として扱われます。
0
とFalse
は偽として扱われます。
ですので文字列の場合も
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演算子は演算の結果を反転します。
つまりTrue
をFalse
に、False
をTrue
にします。
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
上記の場合は1
がnot
でFalse
になり、それがnot
でTrue
になります。
結果的に1
をTrue
に変換することができています。
もっともこの変換をやるなら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 < 2
や2 > 1
がand
より先に評価されます。
色々なオブジェクトと論理演算子
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
上記のようにNone
や0
、空オブジェクトはFalse
になります。
これ以外はTrue
です。
ショートサーキット(短絡評価)
たとえばx and y
でx
が偽の時は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の論理演算子を解説しました。
なにか参考になれば幸いです。
🦝 < 論理的に頼む
🦝 < 眠りのコゴロー