19: Pythonで比較するときに使う演算子と判定方法を理解する

前回の続きです。

比較演算子で条件に合致するか? の結果を得る

ここからは論理型で判定するという話をいたします。論理型、bool型とも言いますが、何かというと真偽値を扱う型です。

真偽値というのは、真がTrue、偽がFalseというものです。

真がYES。条件に合致する場合のことです。

偽というのはNO。条件に合致しない場合という状態を表します。

これが、真偽値・bool型です。

これは条件に応じた処理を行うために用いられます。ほとんどの場合、後でやるif文というものと組み合わせて条件分岐させるときに使います。

例えば、降水確率が80%だったら傘を持っていく、40%だったら持って行かないというような条件分岐の時に使います。

そして、このTrueかFalseかという状態を判定するには2つ方法があります。一つは演算子を使って判定することです。もう一つはデータが空かどうかで判定するというものです。

まずは演算子から見ていきます。演算子には大きく分けて2つあります。比較演算子と論理演算子です。

比較演算子で判定

まずは比較演算子から説明します。

同じか違うか、あるいは条件を超えているかどうか。この辺りは数学と一緒ですね。超えているかとか以上かどうかとかも数学と同じです。そして未満や以下もあります。

そして含まれているかどうかはinを使います。これ以前str型のところでやりましたが、in演算子というものを使って、あるデータにあるデータが含まれているかを判定できます。

そして、notというのは真偽値を反転させるというものです。

== で同じかどうか

これは既に何回か登場していますが、復習でもう一度説明いたします。

a = 10

でaに10を代入し、

a == 10

を実行すると、Trueが返ってきます。

これはaが10と等しい、Trueですということです。

aを11にした場合はFalseになります。

a == 11

変数aの値は10なので、11ではありません。だからコードの実行結果はFalse、つまり違いますとなります。

=! で違うかどうか

a != 11

とした場合、「aは11と違うか?」という判定です。違うものなので、結果はTrueです。

では、11ではなく10とするとどうなるか?

a != 10

aは10なので、結果はFalse。「aは10とは違うか?」という判定は、「違うものではない」。となります。

> 超えているかどうか

次はaは10を超えているかという場合は、

a > 10

aは10を超えているか? というと超えてませんね。これはFalseになります。

>= 以上かどうか

a >= 10

これはaは10以上かどうか? という意味になります。aは10以上ですから、10も含まれますから実行結果はTrueということになります。

< 未満かどうか

a < 10

ではaは10未満かどうか。これも違いますね。aを11にした場合はaは10ですから、Trueとなります。11未満ということです。

<= 以下かどうか

a <= 50

では右辺を50にしてaは50以下か確認します。これはTrueになります。aは10ですから、50以下となります。

in 含まれているか

ある値が文字列とかコレクションに含まれているか判定すると言うのがこのin演算子です。

s = "pyt"
"py" in s

sという変数にpytという値を代入してみます。そして”py”という値が変数sの中に含まれているか尋ねています。この場合は含まれていますので、Trueとなります。

このin演算子が使えるのは文字列型だけではありません。後で扱うリストやタプルでも使えます。詳しくはリストやタプルについて詳しくは後述しますので、ここでは軽く流していただいて構いません。

リストというのは角括弧を使って複数のデータを格納できる型ですが、上記のようにした場合に、このリストの中に5は含まれているか尋ねています。リストには5が入っていますので、これはTrueになります。

5 in [1,2,3,4,5]

では、5ではなくて0にした場合はどうかというと括弧の中には0は入っていませんので、faseになります。

0 in [1,2,3,4,5]

リスト以外にもタプルの場合も同様です。タプルは()で複数の値を格納するものです。

このようにin演算子というのはあるデータの塊の中にinの左辺の値が入っているかというのを判定するときに使います。先述したように文字列の場合、大文字小文字を区別します。

not 真偽値を反転させる

では、次はnotというものを見ていきます。notは真偽値を反転させます。

例えばinでやってみましょう。

上の例では括弧つまりタプルの中に1が入っていますので、これはTrueとなります。

しかし下の例では、not inとした場合、Trueが反転してFalseとなります。1はタプルの中に入っていませんか? と尋ねているということです。

では、値を10にしてやってみます。

タプルの中に10は入っていませんか? と聞いています。入っていませんので、これはTrueになります。

こんな感じで日本語に読み替えながらコードを記述すると、結果を予測しやすくなるかと思います。

ここまでのまとめです。

bool型論理型というのは真偽値、つまりTrueかをFalseを扱う型で条件に合致するかどうかを判定します。

使い方は条件に応じて条件分岐するためにif文と組み合わせて使うと言うことになります。

判定方法は、今見たように演算子を使って判定するか、この後やるデータが空かどうかで判定するという2通りあります。

これら演算子は頻繁に使うことになると思いますので覚えておきましょう。

論理演算子を使って複雑な条件を判定できるようにする

続いて論理演算子を見ていきます。論理演算子というのは、or、and、notを使ったものです。

or 演算子

まずorからです。

野球かサッカーどちらかが好きな人と、その両方が好きな人の場合はorで表現できます。

例えば野球が好き、もしくはサッカーが好き、もしくはその両方という条件に合致するとTrueになるわけです。

and 演算子

一方、andというのは「どちらか、もしくは両方好き」ではなく、「両方好き」という人だけということになります。

図にするとこんな感じですね。

野球、サッカーが好きかで例えますと、野球が好き、なおかつサッカーが好きという両方好きな人だけがTrueになります。

ちなみにこのマルでTrue, Falseを表すのをベン図なんて言います。条件を判定するとき、or や and は非常によく使います。

条件が複雑になってくると、どういう状態だったかなというのがちょっとわかりにくくなります。

そういうときは、このベン図をイメージしながらand, orを読み解くとわかりやすくなると思います。

like_baseball = True
like_football = False

result = like_baseball or like_football
print(result)

この場合は野球は好きですが、サッカーは好きではないと言う状態ですが、どっちかが好きであればTrueになります。どちらも好きではない場合にFalseになります。

次はandを見ていきます。

result = like_baseball and like_football
print(result)

andの場合は、野球もサッカーもどちらも好きじゃないとTrueになりませんので、このプログラムはFalseということになります。

like_baseball = True
like_football = True
result = like_baseball and like_football
print(result)

この場合は、野球もサッカーも両方好きな状態になりましたので、結果はTrueになります。

では、もうひとつ条件を加えてみたいと思います。ハンドボールが好きかどうかというのもやってみます。

like_baseball = True
like_football = True
like_handball = False
result = like_baseball and like_football and like_handball
print(result)

これは3つの円からなるベン図を思い描いていただければと思うんですが、この3つ全てが好きだった場合だけTrueになります。

今回、ハンドボールは好きではないので、falseになります。

3つとも好きだという場合には、結果はTrueになります。ベン図の3つの辺が交わったところですね。

not 演算子

では次は、notを見ていきます。

notは、結果を否定するという意味ですが、一つだけ注意点があります。notを書く場合、notの後に、括弧で囲まないとうまくいかない場合があります。

まずは括弧を使ったパターンから。例えば以下のこのコードを実行するとFalseになります。

括弧の中の結果はTrueですが、それが否定されFalseになるためです。

andをorに書き換えて実行しても実行結果は同じくFalseになります。

ところが、括弧をとった場合は、Trueになります。なぜでしょうか?

result = not like_baseball or like_football

上記のコードの場合、数学の、-1 * 10 + 10のようなことになります。

つまり、-1 *10がまず計算されて、それに10を加えるようなことと同じようなことになります。

括弧を用いる場合、つまり -1 * (10 + 10) は括弧の中がまず計算されその値に -1 を掛けますね。

つまり、「野球もサッカーも好きだからTrue」だけど「notで否定する」となり、Falseになります。

次は括弧を使わない場合です。

変数 like_baseball の値は、trueですが、not like_baseball とすると、否定されてFalse、つまり野球は好きではない、となります。

全体では「野球は好きではないが、サッカーは好き」となり、Trueになります。

括弧を使った場合、使わない場合で結果が変わってきます。

この2つの結果を反転したい場合は、括弧で囲ってからnotを使います。

初心者がつまずいてしまうポイントですから注意してください。

条件が複雑になってくると、このように括弧を使わないとうまく判定できないというケースが時々出てくるようになります。

何かうまくいかないなと思ったときは、括弧に注意して条件を記述してみてください。

以上、論理演算子でした。

データの有無で真偽値を判定して省略記述できるようにする

続いてデータが空かどうかというのでTrueかFalseかを判定する方法です。

値がこれらの状態の時というのはすべてFalseになります。

数値は0とか0.0だったらFalseになりますし、空文字であればFalse、[]はリストですけれど、中身がないのでFalseになります。

波括弧は辞書と言いますが中身がない辞書もFalseになります。

つまり、0とか空っぽとかNoneというのはFalse、それ以外はTrueとして評価されます。

boolという関数があるんですが、これを使うとTrueかFalseがわかります。

bool(0) #Falseになります。
bool(10) #Trueになります。

数値の場合は0の時だけFalseになり、他はすべてTrueです。

bool(''") #Falseになります。
bool("ikuma") #Trueになります。

空文字の場合もFalseになり、それ以外の文字列は、Trueになります。

何か1文字でもいいので、空っぽでなければTrueになります。中身がスペースでもTrueになります。

bool関数は、何もないというときだけFalseになります。

一応リスト型も確認しておきます。

bool([]) #Falseになります。
bool({}) #Falseになります。

空っぽのリストの場合はFalseとなります。

仮にリストや辞書の中に1が入っていたらTrueになります。

ここでの結論は、データが空かどうかでTrueやFalseを判定できるということです。

論理型というのは条件分岐とセットで使うものです。

条件分岐というのはプログラミングする上では非常によく使います。論理型は条件分岐のベースになるのでしっかりおさえておきましょう。