Pythonでは条件を判定する際に、論理演算子(or・and・not)を使う機会がよくあります
論理演算子を使うことでif
の数を減らしたり、簡潔に条件を書くことができるようになるのです
OR
ORは論理和ともいい、与えられた2つの式のうちどちらかが真である場合に真を返してくれます
式1 | 式2 | 式1 or 式2 |
---|---|---|
False | False | False |
False | True | True |
True | False | True |
True | True | True |
ORの構文はこんな感じ
式1 or 式2
実際に使ってみると、
print(1==1 or 0==2)
# True
print(0==3 or 0==2)
# False
if 1==1 or 0==2:
print("or is working!")
# or is working!
このようにして複数を連続で使うことで、3入力ORのように扱うこともできます
動作としては「どれか一つだけでもTrueであればTrue」なのですが、
結局は前のor
から一つずつ処理しているだけです
if True or False or False:
print("multi or !")
# multi or !
AND
ANDは論理積ともいい、与えられた2つの式が両方とも真である場合に真を返してくれます
式1 | 式2 | 式1 and 式2 |
---|---|---|
False | False | False |
False | True | False |
True | False | False |
True | True | True |
ANDの構文はこんな感じ
式1 and 式2
print(1==1 and 0==0)
# True
print(0==3 and 0==0)
# False
if 1==1 and 0==0:
print("and is working!")
# and is working!
こんな感じでand
も連続で使用可能で、3入力ANDのようにして扱うことができます
動作は「全てTrueの時だけTrue」です
しかしこれも前から一つずつand
を処理しているだけなので、特に難しくないと思います
if True and True and False:
print("OK")
else:
print("NG")
# NG
NOT
NOTは否定ともいい、式が真なら偽を返し、偽なら真を返してくれます
式 | not 式 |
---|---|
False | True |
True | False |
構文はこんな感じです
not 式
実際に使用してみると、確かにTrue,Falseが反転していますね
print(not True)
# False
print(not False)
# True
print(not 1==1)
# False
print(not 1==0)
# True
if not 0==1:
print("not is working!")
# not is working!
XORを作ってみる
or
and
not
の論理演算子が使えるので、xor
を使えると思うかもしれませんが、実は使えません
せっかくですので、今回紹介した論理演算子(or and not)でxorを実装してみたいと思います
そもそもXORは排他的論理和とも言われ、以下の真理値表で表さられるものでした
式1 | 式2 | 式1 xor 式2 |
---|---|---|
False | False | False |
False | True | True |
True | False | True |
True | True | False |
主加法標準形(Trueのところを論理和していく)で愚直に実装すると、こんな感じになりますね
確認してみると、確かにxorになっていることがわかります
def xor(a, b):
c = (bool(a) and (not bool(b))) or ((not bool(a)) and bool(b))
return c
print(xor(False, False))
# False
print(xor(False, True))
# True
print(xor(True, False))
# True
print(xor(True, True))
# False
print(xor(1,2))
# False
計算の優先順位
数値の四則演算で演算子に優先順位があるように、論理演算子にも優先順位があり、下記のような順番になります
優先順位 | 演算子 |
---|---|
1 | 比較演算子(== > < etc.) |
2 | not |
3 | and |
4 | or |
論理演算の優先順位はあまり気にすることがないかもしれませんが、優先順位を間違えるとバグの原因になるので気をつけるようにしましょう
コメント