Python の数値型
Python には、整数型(Integer, Int)と浮動小数点型(float)の 2種類の型があります。
Python では、型の判別・表示には type 関数を使用します。
num_i = 100
num_f = 100.0
print(num_i, type(num_i))
print(num_f, type(num_f))
実行結果:
100 <class 'int'>
100.0 <class 'float'>
それぞれ、<class ‘hogehoge’> と現在の型が表示されます。
今度は、 num_i に num_f の値を入れて結果を見てみます。
num_i = num_f
print(num_i, type(num_i)
結果:
100.0 <class 'float'>
数値が、100.0 と小数点がついただけではなく、type 関数の出力も class ‘float’と型が変化していることを確認してください。このように、 Python は一つの変数であっても、入力された値によって型が変化します。
これは便利な半面、バグにつながることも多々ありますので、気をつけて運用しましょう。
<class ‘hogehoge’>の class の部分が気になる人もいるかもしれません。class とは、「オブジェクト」や「インスタンス」ひな形。つまり、ある意味では型と同様の意味となります。この class は学習が進むと、自分で作り、自分だけの型を作ることも可能になります。
他のプログラミング言語では、 int や float というのは class ではなく「プリミティブ型」と呼ばれ区別されることが通常です。なぜなら、数値型や文字型はプログラミング言語が登場した当初からある「原始的な」型ですが、その他の class に分類されるものはオブジェクト指向言語という比較的新しいプログラミング言語で登場した概念だからです。
Python はオブジェクト指向プログラミングが浸透した後に登場した新しい言語であるため、プリミティブ型は存在せず、すべての型が class となってします。そのため、 Python に限っては、class というのは「大体、型なんだな……」という理解で問題ありません。
Python の四則演算と代入、剰余
代入
ここまで、なんの説明もなく使ってきた = ですが、これは「代入演算子」と呼ばれます。意味は、代入演算子の右辺を、左辺に代入します。なお、この代入は数学の代入とほぼ同じような意味ですが、ここでは「コピーする」という意味だと思って下さい。
num_i = 10 #右辺の 10 を左辺の num_i に代入している
num_j = num_i #右辺の num_i (の中身)を num_j に代入している
print('num_i:', num_i,'num_j:', num_j)
結果:
num_i: 10 num_j: 10
※代入は移動ではなくコピーのため、両方に 10 という値が保持されている
また、代入は右辺を左辺にコピーするため、以下のような記述ではエラーとなる。
10 = num_i
結果:
File "<stdin>", line 1
10 = num_i
^^
SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
数学の方程式を解く場合などは = で挟んだ右辺・左辺は等値を意味するので書きやすいように整理すると思いますが、プログラミングにおいては代入を意味し、右辺・左辺で意味が異なります。
慣れれば間違えることはありませんが、最初は気をつけましょう。
加算
足し算のことです。
print(num_i + num_j)
print(num_i)
結果:
20
10
予想した結果と違いましたか? 原則的に、プログラミングでは代入しなければ演算に使われた変数の中身は変化しません。そのため、 num_i に計算結果を保存したければ、
num_i = num_i + num_j
print(num_i)
結果:
20
とします。
一見、文字式・方程式と似ていますが、似て非なるものだということが分かります。
減算
値の保存には代入が必要だと理解していれば、加算と同様、算数・数学と同様に扱えます。
num_i = num_i - num_j
print(num_i)
結果:
10
乗算(かけ算)
乗算には、×に相当する半角文字がないため、 * アスタリスク(Shift キーを押しながら : コロン)記号を使います。
num_i = num_i * num_j
print(num_i)
結果:
100
除算(割り算)
除算には、 / スラッシュ記号を用います。また、他の四則演算にはない注意点があります。
num_i = num_i / num_j
print(num_i, type(num_i))
結果:
10.0 <class 'float'>
このように、先ほどまでと違い計算結果に .0 がついていて、type 関数も float と表記しています。 100 / 10 は 10 と割り切れますが、整数で割りきれるか割りきれないかに関わらず float 型になります。
大きな問題になることは少ないですが、覚えておきましょう。
剰余(割り算の余り)
余りを求めるには、% パーセント記号を使います。
remain = 10 % 3
print(remain, type(remain))
結果:
1 <class 'int'>
演算の優先度と () 丸括弧
算数・数学と同様に Python の式にも優先度があります。数式と同様に
乗算*、除算/、剰余% > 加算+, 減算-
の優先順位となります(剰余は普通、数式には出ませんが)。
この順位を変更し、加減算を優先して計算するには、数式と同様に () 丸括弧を使います。
print(1 + 2 * 10 - 5)
print(1 + 2 * (10 - 5))
print((1 + 2) * (10 - 5))
結果:
16
11
15
整数 int が float になるとき
除算の項目でみたように、 int 型を使用していても、 float になってしまうことがあります。int 型同士の演算では、除算を使った際に float となります。
その他、 int と float を混在させた演算を行った場合は、基本的に float 型となります。
print(1 + 1.0, type(1 + 1.0))
print(1 - 1.0, type(1 - 1.0))
print(10 * 1.0, type(10 * 1.0))
print(10 % 1.0, type(10 % 1.0))
結果:
2.0 <class 'float'>
0.0 <class 'float'>
10.0 <class 'float'>
0.0 <class 'float'>
※数学的に剰余は整数を返すもので、処理系によってはこのような計算でも整数を返します。しかし、 Python の場合は float になっていますので気をつけます。
明示的な型変換
int から float へは計算の結果として勝手に変換されることが多いためあまり困りませんが、float型を整数型にしたい局面は多くあります。そういう場合には、int関数、float関数を使います。
print(int(10 % 1.0), type(int(10 % 1.0)))
print(float(1 + 1), type(float(1 + 1)))
結果:
0 <class 'int'>
2.0 <class 'float'>
相互に変換されていることが分かります。また、int への変換の際には、小数点以下は切り捨てになります。
print(10 - 0.01, type(10 - 0.01))
print(int(10 - 0.01), type(int(10 - 0.01)))
結果:
9.99 <class 'float'>
9 <class 'int'>