2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】ブール演算子(or/and)はブール値を返さない

Posted at

Pythonにはorandnotという演算子が存在していますが、これらはブール演算子と呼ばれます。

Pythonにおける真理値

Pythonはどのようなオブジェクトも真理値(真偽値)として表すことができ、組み込み関数の中では以下のようなものが偽と判定されます。

  • 偽であると定義されている定数: None と False
  • 数値型におけるゼロ: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • 空のシーケンスまたはコレクション: '', (), [], {}, set(), range(0)

また、オブジェクトのクラスが__bool__()メソッドを定義しており、それがFalseを返す場合か、__len__()メソッドを定義していて0を返す場合には偽と判定されます。

判定の際には組み込み関数bool()を利用します。

>>> bool(None)
False
>>> bool(False)
False
>>> bool(0)
False
>>> bool("")
False
>>> bool([])
False
# 偽ではないものは全て真となる
>>> bool("0")
True
>>> bool([False])
True

orの使い方

AまたはBのどちらか一方が真かどうか判定したいときなどに利用されます。
if文などの制御構文の外でももちろん利用できます。

>>> x = True
>>> y = False
>>> x or y
True
>>> bool(x or y)
True

ちなみにorと後述するandはブール値を返さず、比較したオブジェクトを左から値を評価していき、戻り値が確定したタイミングでそのまま返します。

上記の例(x or y)では

  • xが真であるならyを評価せずxを返す(yが真でもxを返す)
  • そうではないならyを返す

という動作をします

>>> a = 0 # 真理値がTrueとなる値を定義
>>> b = 1 # 真理値がFalseとなる値を定義
>>> a or b # bがTrueなのでbが返る
1
>>> b or a # 逆にしてもbがTrueなのでbが返る
1

>>> b = "" # 真理値がFalseとなるaとは別の値を再代入
a or b # aがFalseなのでbが返る
""

ちなみにorは2つ以上連結しても同様の動作をして、左から評価されていきます。

>>> a = 0
>>> b = 1
>>> c = 2
>>> a or b or c
1

真理値を返す演算子だと勘違いされがちですが、忘れないようにしましょう。

andの使い方

andAとBのどちらも真かどうかを判定したいときなどに利用できます。

andについても戻り値は評価対象のオブジェクトのため、ブール値が返るわけではありません。

>>> x = 0
>>> y = 1
>>> x and y
0

orと同様に結果が確定した段階でオブジェクトを返します。

  • xが偽ならxを返す
  • それ以外ならyを返す

という動作をします。

偽となるオブジェクトが発見次第結果を返却してしまうため、厳密には比較対象全てが真であることをチェックしていないことに注意してください。

andについても2つ以上の連結が可能です。

>>> a = 0
>>> b = 1
>>> c = 2
>>> a and b and c # aが偽なのでaを返す
0
>>> d = 10
>>> d and b and c # dが真、bが真でcを確認した際に結果が確定するのでcが返る
2

notの使い方

notは否定を表す演算子であり、not Falseなどのように後ろに一つだけ値を取り、その値を否定します。

上記説明の二つの演算子と違い、返却するのはブール値になります。

>>> x = 0
>>> y = 1
>>> not x # xはFalseとなる値であるが、notをつけるとTrueになる
True
>>> not y # yはTrueとなる値であるが、notをつけるとFalseになる
False

notorandよりも優先度が高く、先に評価されます。

>>> a = 0
>>> b = 1
>>> c = 2
>>> not a and b and c # 偽であるaが否定され真になり、全て真であるため最後に評価されたオブジェクトcが返る
c
>>> d = 10
>>> d and not b and c # 全て真であったが、bが否定されFalseとなるためbが返る
False

基本ではありますが、戻り値について忘れがちなため、意識して利用するようにしていきたいです。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?