基本的な数値の演算

演算

数値型の場合、以下の演算を利用することができます。また、演算子以外にabs、int、float、complex、c.conjugate、divmod、powといった組込み関数で演算することができます。
以下の表は、演算の優先順位の低い順にソートされています。
演算の一覧

演算 結果
x + y x と y の和
x – y x と y の差
x * y x と y の積
x / y x と y の商
x // y x と y の商を切り下げたもの
x % y x / y の剰余
-x x の符号反転
+x x そのまま
abs(x) x の絶対値または大きさ
int(x) x の整数への変換
float(x) x の浮動小数点数への変換
complex(re, im) 実部 re, 虚部 im の複素数。 im の既定値はゼロ。
c.conjugate() 複素数 c の共役複素数
divmod(x, y) (x // y, x % y) からなるペア
pow(x, y) x の y 乗
x ** y x の y 乗

一般的なプログラム言語と変わりませんが、商は2種類あるので注意してください。
サンプルで確認してみましょう。

# 四則演算
x = 16
y = 3
val = x + y
print(val) # 19

val = x - y
print(val) # 13

val = x * y
print(val) # 48

val = x / y
print(val) # 5.333333333333333

val = x // y
print(val) # 5
val = x % y
print(val) # 1

val = int(x / y)
print(val) # 5

val = float(x)
print(val) # 16.0


# 複素数
val = 3 + 5j
print(val.conjugate()) # (3-5j)

# 乗数
val = pow(2, 3)
print(val) # 8

val = 2 ** 3
print(val) # 8

数値と数値演算で使用するモジュール

数値クラスとデータ分析等の際に数値演算でよく利用するモジュールを簡単に紹介します。

これらは組込みモジュールではないため、モジュールのインポートが必要となります。モジュールとimport文に関する説明は別項にて説明しますので、とりあえずこう書くのだな、と思って読んでください。

numbersモジュール

numbersモジュールのnumbers.Numberクラスが数の抽象基底クラスです。与えられた変数が数値化どうか、すなわちint、float、complexのいずれかかどうかを判定する際、isinstance関数に指定します。

>>> isinstance(1, numbers.Number)
True
>>> isinstance(1.1, numbers.Number)
True
>>> isinstance(-1, numbers.Number)
True
>>> isinstance(5 + 3j, numbers.Number)
True
>>> isinstance(True, numbers.Number)
True
>>> isinstance('text', numbers.Number)
False

数値の場合はTrueが返っていることが確認できると思います。

注意が必要なのが、真偽値の場合です。以前にも書きましたが、真偽値はint型のサブクラスなので、判定はTrueになります。

math, cmathモジュール

数値演算で利用する関数セットです。いくつか例を交えて紹介します。

import math

# 指数関数
val = math.exp(2)
print(val) # 7.38905609893065

# 対数関数
val = math.log(5)
print(val) # 1.6094379124341003

# 三角関数
val = math.sin(math.pi / 2)
print(val) # 1.0

指数関数、対数関数、三角関数など一通り利用できます。また、円周率やネイピア数なども定数として準備されています。データ分析では非常に使用するモジュールです。
なお、mathモジュールは複素数型では利用できません。複素数の場合はcmathを利用します。実数と同様の演算が可能ですので、サンプルは省略します。

decimalモジュール

10進数の浮動小数点に対応しています。

floatは内部的には2進数なので、簡単な計算で誤差が発生します。例えば、float型の0.1に3を掛け算すると、以下のようになります。これは、0.1が内部的には2進数の無限小数になっていることに起因します。

x = 0.1 * 3
print(x) # 0.30000000000000004

is_equal = (0.1 * 33 == 3.3)
print(is_equal) # False

もし金融系や科学技術分野の処理で精緻な計算が必要な場合は、decimalを利用します。上と同じ計算をdecimalで行ってみます。

from decimal import Decimal
x = Decimal('0.1')
print(x) # 0.1
print(x * 3) # 0.3

Decimal('0.3')
is_equal =  (x * 33 == Decimal('3.3') )
print(is_equal) # True
                    

decimalを使用することで、想定通りの結果を得ることができました。

fractionsモジュール

有理数、つまり分数をサポートするモジュールです。除算と積算が交互に行われるような計算をする場合、徐々に誤差が蓄積していきますが、fractionsを利用するとその誤差を少なくすることができます。また、約分も自動的に行われます。

from fractions import Fraction

# 分数の定義
x = Fraction(3, 7)
print(x) # 3/7 

# 約分の確認
y = x * 7
print(y) # 3 

# 小数との演算
z = x + 0.1
print(z) # 0.5285714285714286

上のサンプルでは、3/7に7を掛け算し約分がサれていることが確認できます。また、小数型との演算も可能であることも確認できます。

その他

上記に上げた基本的なモジュール以外に、擬似乱数を生成するrandomモジュール、統計計算をサポートするstatisticsモジュールといったものがあります。

専門的な内容となるため、詳細は別記事に記述する予定です。