< 前の記事 | Web講座TOP | 次の記事 >

初心者向け Pythonパイソン講座 - 第4回「数の比較ひかく論理ろんり演算」

投稿者:3G 大毛


今回は数を比べること、つまり比較ひかくについて学んでいきます。難しいことはありません。皆さんおなじみ、未満「<」や以下「≦」のことです。比較した結果は「正しいか正しくないか」という2択ですね。この2択をデータと考えていろいろな計算をするのが論理ろんり演算です。例えば「150cm以上かつ180cm未満」、「30歳以下または60歳以上」、「学生でない」と言ったときの「かつ」「または」「でない」のことを論理演算子と言います。



TrueトゥルーFalseフォルス (boolブール型)


Pythonではしんか、つまり正しいか正しくないか、ということもデータとして扱います。真のことは英語で「Trueトゥルー」、偽のことは英語で「Falseフォルス」と言います。


boolブール

これら2つのデータをboolブール型と言います。boolとはbooleanブーリアンの略で、Booleブールという数学者に由来ゆらいします。


Colabを開いてTrueとFalseについて調べてみましょう。以下のように入力してみてください:


print(True)
print(type(True))
print(False)
print(type(False))


TrueやFalseがbool型のデータであることが分かりました。


より小さい(<)・以下(<=)・等しい(==)・等しくない(!=)


Pythonでは「1は2より小さい(1は2未満)」ということを「1<2」と書きます。



「1<2」は正しいので「True」と出力されました。試しに「1<1」と書いてみましょう。



「1<1」は正しくないので「False」と出力されました。



Pythonでは「1は2以下」ということを「1<=2」と書きます。



「1<=2」は正しいので「True」と出力されました。試しに「1<=1」と書いてみましょう。



今度は「True」になりました。1は1以下なので正しいのです。



Pythonでは「aとbが等しい」ということを「a==b」と書きます。算数の時とは違いイコール記号を2つ重ねるので注意しましょう。 「aとbが等しくない」ということは「a!=b」と書きます。




さて、ここまでに4つの記号「<」「<=」「==」「!=」が出てきました。これらは「比較ひかく演算子」と言います。実は、足し算の「+」と同じく2項演算子のなかまです。思い出しましょう、2項演算子とは2つの入力データを引き受けて、いくつかの出力データを返す記号でした。足し算「+」の出力は数でしたが、ここでの出力はTrueかFalse、つまりbool型のデータになります!



ちなみに、「より大きい」と「以上」を表すには式を逆にすればいいだけですから特に問題ないと思います。ただし、Pythonでは逆向きにした記号も用意されていて、それぞれ「>」と「>=」とも書けます。



比較結果を変数にする


比較した結果もデータですから、前回学んだように変数にバインドできます。次のように入力してみましょう:


a = (1<2)
print(a)
print(type(a))


変数aに「1<2」の結果がバインドされ、bool型のTrueを表すようになりました。


言い忘れていましたが、単語や記号の間には見やすくするために空白を入れてもOKです(ただし「<=」のような記号は2文字で1つの記号と考えます)。空白の個数はいくつでも自由ですが、改行はNGです。それから、行の先頭に入れる空白は「インデント」と言って特別な意味があるので、決まった数しか入れることはできません。今回はインデントは0、つまり先頭に空白は入れてはいけません。


比較演算子の2つの入力は整数でなくても、いろいろなデータでも問題ありません。bool型の比較をしてみましょう。


a==True


変数aはTrueだったのでこの式もTrueとなります。


論理ろんり演算子(andアンド, orオア, notノット


初めに紹介したように「かつ」「または」「でない」のような言葉を論理ろんり演算子と言います。「AかつB」というのはAとBのどちらも正しいという意味です。「AまたはB」というのはAとBの少なくとも一方が正しいという意味です。ここでAやBはTrueかFalseのどちらかを表すbool型のデータです。


このセクションでは「True」や「False」がたくさん出るので、あらかじめ「True」を意味する変数「T」と「False」を意味する変数「F」を用意しておきましょう:


T = True
F = False

まずは「でない」から行きましょう。Pythonでは「Aでない」を「notノット A」と書きます。


print(not T)
print(not F)


このようにnotで計算すると「True」は「False」に、「False」は「True」になります。つまり逆になるだけです。簡単ですね。


次は「かつ」です。Pythonでは「AかつB」を「A andアンド B」と書きます。


print(T and T)
print(T and F)
print(F and T)
print(F and F)


両方とも「True」の時だけ「True」になりました。


最後に「または」です。Pythonでは「AまたはB」を「A orオア B」と書きます。


print(T or T)
print(T or F)
print(F or T)
print(F or F)


少なくとも一方が「True」のときは「True」になりました。


ちなみに、論理演算子の優先順は「not」>「and」>「or」となります。ですから、「not T and F」は「(not T) and F」と読まれて「False」になります。また、「T or T and F」は「T or (T and F)」と読まれて「True」になります。れないうちはできるだけカッコをつけたほうが安全でしょう。



小数の比較(中級者向け)


小数の比較も同じようにできますが、かなり注意が必要ですので初心者のうちはできるだけけた方がよいかもしれません。次のように入力してみてください:


1.2-0.3==0.9

1.2-0.3を計算すると0.9になるのでTrueが返ってくるはずですね。ところが、実際にはFalseとなります:



おかしいですね。Pythonが計算を間違ったのでしょうか?次のように入力して詳しく調べてみましょう:


a = 1.2-0.3
b = 0.9
print(a)
print(b)
print(b-a)

左辺を変数a、右辺を変数bとおいて、aとbの値と、その差b-aを表示してみます:



計算の誤差のせいでaの方がわずかに小さくなっていることが分かりました!


このようなことはPythonだけでなく、浮動小数点数を使うすべてのプログラミング言語で起こります。残念ながら単純な解決さくはありません。


 「roundラウンド関数を使う方法」 (※クリックして展開して下さい

解決策の一つは、roundラウンド関数を使って両辺の小数の、小数点以下のけた数を少なくしてから比較する方法です。「round(a,n)」は、小数第n位までで書ける(10進法しんほうの)小数の内、float型に変換すると(*注) aに一番近くなるものを返します。(*注 コンピュータは2進法で動いているので、10進法の小数をfloat型に変換すると少し違う数になってしまうことがあります。)


a = round(a,8)
b = round(b,8)
print(a)
print(b)
print(b-a)
print(a==b)


round関数でaとbを試しに小数第8位までの数にしてから比較してみたところ、等しい(True)と判断するようになりました!



< 前の記事 | Web講座TOP | 次の記事 >

TOP