Python入門|論理演算子(or,and,not)で複雑な条件判定方法【bool型】のイメージ画像

Python入門|論理演算子(or,and,not)で複雑な条件判定方法【bool型】

  • 公開日:2018/06/04
  • 更新日:2018/10/19
  • 投稿者:n bit

今回はPythonの論理演算子(or、and、not)を使った条件式の判定方法について学習します。比較演算子と論理演算子の組み合わせを利用することで様々な条件の適合、不適合を判断し、真偽値を取得します。また、論理演算子の優先順位による問題点やその解決方法も学習します。

  • Python

この記事は約 分で読めます。(文字)

論理演算子で複雑な条件の真偽値取得

3つの論理演算子【or、and、not】を使った条件式を学習していきます。

論理演算子とは

前回は比較演算子を使って2つ以上の要素の値を比較しその結果を真偽値で取得しました。

比較演算子を使った要素の比較の記述を「条件式」と呼びますが、論理演算子ではその条件式を複数接続して新たな条件式を作成することができます。

条件式

a >= b

論理演算子一覧と優先順位

Pythonで利用することができる論理演算子は下記の一覧表の通りです。

演算子演算例演算
or条件式A or 条件式B条件式Aか条件式Bの値いずれかが「True」の時「True」
and条件式A and 条件式B条件式Aと条件式Bの値が共に「True」の時「True」
notnot 条件式A条件式Aの値が「False」の時「True」
  • ※ 上記の条件に該当しない場合は全て「False」

比較演算子と違って論理演算子には優先順位があります。上記の表は優先順位の低いものから並べています。四則演算の演算子であれば和(\(+\))や差(\(-\))よりも積(\(*\))や商(\(/\))が優先されて演算されますよね。比較演算子もこれと同じような優先順位が存在していると考えてください。

例えば、notが論理演算子の中で最優先されますので、下記のように複数の論理演算子が混在した場合はnotから条件判定されて行きます。

a < b or a >= c and not a == d

同ページで後ほどすべて詳しく解説していきますので、ここでは、上記の条件式を見て何をやっているかわからなかったとしても安心してください。一つ一つの論理演算子の説明と事例を見ていくことで後ほど理解できるようになります。

or:演算子

or演算子は2つの条件式をつなぎ、いずれかの条件式の結果が「True」の場合「True」を返します

  • 条件式A or 条件式B

実際に1つ事例を作って確認してみましょう。

a = 10

b = 15
c = 12
x = a > b or a != c
print(x)

出力結果

True

出力結果は「True」が返されています。

or演算子を使った条件式の中に2つの条件式が含まれています。それぞれの条件式を分解して出力結果を確認すると下記のようになります。

  • ※:or演算子を使った条件式の左辺を条件式A、右辺を条件式Bとします。

条件式A

x = a > b

print(x)

出力結果

false

条件式B

x = a != c

print(x)

出力結果

True

条件式Aと条件式Bの内、条件式Bの出力結果が「True」のためorを使った条件式の最終出力結果も「True」となります。

or演算子は「条件式Aか条件式Bいずれかの出力結果がTrue」であればよかったのでこのような条件判定結果になります。

and:演算子

and演算子は2つの条件式をつなぎ、両方の条件式の結果が「True」の場合「True」を返します

  • 条件式A and 条件式B

事例を作って確認してみましょう。

a = 10

b = 15
c = 12
x = a > b and a != c
print(x)

出力結果

False

出力結果は「False」が返されています。

and演算子を使った条件式の中に含まれている2つの条件式を分解して出力結果を確認すると下記のようになります。

  • ※:and演算子を使った条件式の左辺を条件式A、右辺を条件式Bとします。

条件式A

x = a > b

print(x)

出力結果

False

条件式B

x = a != c

print(x)

出力結果

True
条件式Aと条件式Bの内、条件式Aの出力結果が「False」のためandを使った条件式の最終出力結果は「False」となります。

and演算子は「条件式Aと条件式B両方の出力結果がTrue」の必要があるのでこのような条件判定結果になります。

not:演算子

not演算子は先ほどまでのor演算子とand演算子とは少し違い、1つの条件式の前にnot演算子を付与して利用します。not演算子は条件式全体を否定するもので、not演算子の後に記述する条件式の結果が「False」の場合「True」を返します

  • not 条件式A

事例を作って確認してみましょう。

a = 10

b = 15
x = not a > b
print(x)

出力結果

True

出力結果は「True」が返されています。

not演算子の後に記述した条件式の出力結果を確認すると下記のようになります。

条件式A

x = a > b

print(x)

出力結果

False

条件式Aの出力結果が「False」のためnotを使った条件式の最終出力結果は「True」となります。

not演算子は「条件式Aの出力結果がFalse」であればよいのでこのような条件判定結果になります。

組み合わせた論理演算子の優先順位と条件判定

論理演算子を一通り理解したところで最初に示した論理演算子を複合した条件判定を分解してもう一度見てみましょう。今度は実際に変数へ値を格納して確認します。

例題は、15より小さい、または、30以上の数値で、かつ、5以外の数値であれば「True」になる条件判定を考えます。

例題の条件を整理します。

  • 条件1:15より小さい、または、30以上の数値
  • 条件2:かつ、5以外の数値

条件1「15より小さい、または、30以上の数値」を満たす条件式はor演算子ですね。

a = 5

b = 15
c = 30
x = a < b or a >= c
print(x)

出力結果

True

変数\(a\)の値は\(5\)ですので、\(a < 15\)の条件に通り最終の出力結果は「True」になります。

条件2「かつ、5以外の数値」を満たす条件式はand演算子で、先程の条件1の条件式の後に付け足しますと下記のようになります。

a = 5

b = 15
c = 30
d = 5
x = a < b or a >= c and not a == d
print(x)

変数\(a\)の値が\(5\)で、変数\(d\)の値も\(5\)のため、下記の条件式の出力結果は\(a == d\)で「True」、それをnot演算子で否定するので「False」になりますよね。

not a == d

そのため、条件式\(a < 15\;or\;a >= c\;and\;not\;a == d\)で返される出力結果は「False」を期待しますが実際の出力結果は「True」になっています。

出力結果

True

なぜこのような出力結果になってしまうのでしょうか。

論理演算子には優先順位がありましたね。優先順位はor演算子が1番弱く、not演算子が1番優先されます。

  • or < and < not

ちなみに、四則演算の演算子はnot演算子よりもさらに優先順位が高く先に演算されています。

  • or < and < not < \(+,-\) < \(*,/,\%\) < \(**\)

そのため先程の条件式の演算は次のような順序で判定されます。

  • \(a >= c\;and\)(かつ) \(not\;a == d\)、or(または)\(a < 15\)

\(a >= c\) かつ \(not\;a == d\)では「False」となりますが、\(a < 15\)で「True」になります。or演算子は右片または左辺のいずれかが「True」であれば最終の出力結果も「True」となるため、条件式\(a < 15\;or\;a >= c\;and\;not\;a == d\)の出力結果が「True」になってしまっているのです。

このように演算子の優先順位を考えておかないと意図しない条件判定の結果が返ってきてしまいます。

括弧【 () 】を使って優先順位を変更

では、この問題を解消する方法を解説します。このような場合、一般的な数値の演算と同じで括弧【() 】を使うことで優先順位を変更することができます。

先程の条件式に括弧【() 】つけて優先順位を変更します。

a = 5

b = 15
c = 30
d = 5
x = (a < 15 or a >= c) and not a == d
print(x)

条件式\(a < 15\;or\;a >= c\)に括弧【() 】をつけたことで先に比較演算され、その後に\(and\;not\;a == d\)が比較演算されます。

最終に比較演算されるand演算子の右辺\(not\;a == d\)の出力結果が「False」のため、出力結果も「False」になっています。

出力結果

True

これで期待する演算結果が正常に返ってくるようになりました。

今日のdot

Pythonの比較演算に論理演算子を組み合わせて利用することでより複雑な条件判定を行えるようになります。論理演算子には優先順位がありますのでその順序に注意しながら自分の意図する条件判定結果が得られるように括弧【() 】つけて利用し優先順位を上手くコントロールしましょう。

論理演算子一覧と優先順位

  • ※:上から優先順位が低い順

演算子演算例演算
or条件式A or 条件式B条件式Aか条件式Bの値いずれかが「True」の時「True」
and条件式A and 条件式B条件式Aと条件式Bの値が共に「True」の時「True」
notnot 条件式A条件式Aの値が「False」の時「True」
  • ※ 上記の条件に該当しない場合は全て「False」