Pythonの論理演算子(or, and, not)は、一般的なorやandの考え方とちょっと違っています。何も考えずに使うと不具合動作の元になりそうですので、今回、自分自身への備忘録も兼ねて改めてまとめてみました。
# 2019/1/2 誤記修正
# 2019/2/3 微修正
確認した環境
- Ubuntu16.04LTS
- Python3.7.0
論理演算子の定義
公式リファレンスにもあるとおり、Pythonでの論理演算子は下記の通り定義されています。
演 算 | 結 果 | 備 考 |
---|---|---|
x or y | x がFalseなら y, そうでなければ x | xがFalseの場合に、yが評価される (短絡評価) |
x and y | x がFalseなら x, そうでなければ y | xがTrueの場合に、yが評価される (短絡評価) |
not x | x がFalseなら True, そうでなければ False | "==", "<", ">" 等の比較演算子よりも優先度は低い |
ちょっと分かり難いので、もう少し書き下してみます。
論理和(or)
論理和(or)は、以下のように表せます。
x | y | 結果 | 備考 |
---|---|---|---|
True | True | True | xがTrueなので、xを出力 |
True | False | True | |
False | True | True | xがFalseなので、yを出力 |
False | False | False |
コマンドライン上で確認してみます。
>>> True or True
True
>>> True or False
True
>>> False or True
True
>>> False or False
False
気をつけたいのは、結果はブール値ではなく、x(またはy)の値で返るということです。よって、例えばx=10、y=20とした場合は以下のような結果になります。
>>> x = 10
>>> y = 20
# xはTrue(bool(10) はTrue)なので、xを出力
>>> x or y
10
ちなみに、if文やwhile部の条件部分で使われる場合は、以下のようにPythonがbool値に自動で変換してくれるようです。
>>> x = 10
>>> y = 20
>>> if x or y:
... print('True')
... else:
... print('False')
...
True
また、x(演算子の左辺)がFalseの場合にのみ、y(右辺)の処理が行われるので(短絡評価)、yの実行結果が必要な場合は注意が必要です。(どのような場面で使われるのかはちょっと思いつきませんが、、)
論理積(and)
同様に、andも書き下してみます。
x | y | 結果 | 備考 |
---|---|---|---|
True | True | True | xがTrueなので、yを出力 |
True | False | False | |
False | True | False | xがFalseなので、xを出力 |
False | False | False |
コマンドライン上で確認してみます。
>>> True and True
True
>>> True and False
False
>>> False and True
False
>>> False and False
False
こちらもorと同様に、結果はxまたはyの値となります。上記同様に、x=10, y=20という数値の場合の挙動を示します。
>>> x = 10
>>> y = 20
# xはTrue(bool(10) はTrue)なので、yを出力
>>> x and y
20
またこれもorと同様ですが、x(演算子の左辺)がTrueの場合にのみ、y(右辺)の処理が実行されるので(短絡評価)、yの実行結果が必要な場合は注意が必要です。
否定(not x)
notは、上記2つと異なり、bool値を返します。
x | 結果 |
---|---|
True | False |
False | True |
コマンドライン上で確認してみます。
>>> not True
False
>>> not False
True
また、この演算子は論理演算子(”==”, “>”, “<“など)の非ブール演算子よりも優先度が低いので、以下のような書き方には注意が必要です。
# 以下は、not (x == y)と解釈される
>>> not x == y
False
# 以下は構文エラー
>>> x == not y
File "", line 1
x == not y
^
SyntaxError: invalid syntax
まとめ
今回は、Pythonで使われる論理演算子or, and, notについてまとめました。短絡評価となる点や、XやYの値が返る点は、一般的なORやANDと異なっていますので、注意が必要です。