このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】数値を使った計算

数値を使った計算

 Pythonプログラミングにおいて、数値を使った計算は基本的かつ重要な操作です。数値データを扱う際には、さまざまな演算子を駆使して計算を行います。これにより、複雑な数値処理やアルゴリズムの実装が可能となります。ここでは、数値計算における基本的な演算子の使い方、演算子の優先順位、そして関数を組み合わせた複雑な式の作成方法について詳しく解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.演算子の基本

 演算子とは、数値や変数に対して特定の操作を行うための記号やキーワードのことです。Pythonには、算術演算子、比較演算子、論理演算子など、さまざまな種類の演算子が用意されています。ここでは、主に算術演算子について学びます。

ポイント

  • 演算子を理解することで、数値データの操作が容易になる。
  • 演算子の優先順位を理解することで、複雑な式を正確に評価できる。

2.算術演算子

 算術演算子は、数値同士の基本的な計算(加算、減算、乗算、除算など)を行うための演算子です。以下の表に、主な算術演算子とその用途、使用例をまとめました。

演算子使い方機能出力
+A + B加算(足し算)7 + 310
-A - B減算(引き算)10 - 46
*A * B乗算(掛け算)6 * 742
/A / B除算(割り算)15 / 43.75
//A // B除算(割り算)、結果にfloor関数を適用する。15 // 43
%A % B剰余(割り算の余り)15 % 43
**A ** Bべき乗(AのB乗)2 ** 38
@A @ B行列積(行列の掛け算)matrix1 @ matrix2行列の積

2.1. 二項算術演算子の使い方

 二項算術演算子は、2つのオペランド(値や変数)に対して演算を行います。以下に具体的な例を示します。

サンプルプログラム

# 加算の例
a = 12
b = 8
result_add = a + b
print(result_add)  # 出力: 20

# 減算の例
result_sub = a - b
print(result_sub)  # 出力: 4

# 乗算の例
result_mul = a * b
print(result_mul)  # 出力: 96

# 除算の例
result_div = a / b
print(result_div)  # 出力: 1.5

# 整数除算の例
result_floor_div = a // b
print(result_floor_div)  # 出力: 1

# 剰余の例
result_mod = a % b
print(result_mod)  # 出力: 4

# べき乗の例
result_pow = a ** 2
print(result_pow)  # 出力: 144

実行結果

20
4
96
1.5
1
4
144

解説

  • a + bは12と8を加算し、結果は20となります。
  • a - bは12から8を引き、結果は4です。
  • a * bは12と8を掛け、結果は96です。
  • a / bは12を8で割り、結果は1.5(浮動小数点数)です。
  • a // bは12を8で割り、結果は1(整数)となります。
  • a % bは12を8で割った余りを求め、結果は4です。
  • a ** 2は12の2乗を計算し、結果は144です。

2.2. 行列積演算子 @

 行列積を計算するための@演算子は、Pythonの組み込み型では使用できませんが、NumPyなどの外部ライブラリを利用することで行列積を簡単に計算することができます。

 事前にNumpyライブラリをインストールしておく必要があります。インストールについては以下のリンクを参考にしてください。

【Python入門】開発環境:仮想環境へのNumpyパッケージのインストール

このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。 【Python入門】開発環境:仮想環境へのNumpyパッケージのインストール 開発環境:仮…

サンプルプログラム

import numpy as np

# 行列の定義
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

# 行列積の計算
result_matrix = matrix1 @ matrix2
print(result_matrix)
# 出力:
# [[19 22]
#  [43 50]]

実行結果

[[19 22]
 [43 50]]

解説

  • NumPyライブラリをインポートし、2つの2x2行列を定義します。
  • matrix1 @ matrix2によって行列積が計算され、結果は[[19, 22], [43, 50]]となります。

注意点

  • 行列積演算子@を使用するには、NumPyなどの行列計算をサポートするライブラリが必要です。
  • 組み込み型のリストでは@演算子はサポートされていません。

3.演算子の優先順位

 演算子の優先順位(オペレーター優先度)は、複数の演算子が同じ式内で使用される場合に、どの演算子が先に評価されるかを決定するルールです。優先順位を正しく理解することで、予期しない結果を避けることができます。

優先順位の基本

以下に、主な算術演算子の優先順位を高い順にまとめました。

優先順位演算子説明
1**べき乗
2*, @,/, //, %乗算、行列積、除算、整数除算、剰余
3+, -加算、減算

ポイント

  • べき乗演算子**が最も高い優先順位を持ちます。
  • 次に、乗算*、行列積@、除算/、整数除算//、剰余%が同じ優先順位を持ちます。
  • 最後に、加算+と減算-が低い優先順位となります。

優先順位の例

サンプルプログラム

# 例1: べき乗と乗算
result1 = 2 + 3 * 4 ** 2
print(result1)  # 出力: 2 + 3 * 16 = 2 + 48 = 50

# 例2: 括弧を使用した優先順位の変更
result2 = (2 + 3) * 4 ** 2
print(result2)  # 出力: 5 * 16 = 80

# 例3: 行列積と他の演算子
import numpy as np

matrix1 = np.array([[1, 0], [0, 1]])
matrix2 = np.array([[2, 3], [4, 5]])

result3 = matrix1 @ matrix2 + 10
print(result3)
# 出力:
# [[12 13]
#  [14 15]]

実行結果

50
80
[[12 13]
 [14 15]]

解説

  • 例1では、**が先に評価され、次に*、最後に+が評価されます。結果は50となります。
  • 例2では、括弧によって2 + 3が先に評価され、次に**、最後に*が評価されます。結果は80となります。
  • 例3では、行列積@が評価された後に、数値の加算+が行われます。結果は各要素に10が加えられた行列となります。

注意点

  • 演算子の優先順位を明確にするために、複雑な式では括弧を使用することが推奨されます。
  • 括弧を使用することで、意図した順序で演算が行われ、コードの可読性も向上します。

4.関数と演算子の組み合わせ

 演算子を関数と組み合わせることで、より複雑な計算や処理を行うことができます。Pythonには、数値計算をサポートする多くの組み込み関数や標準ライブラリが用意されています。

例:組み込み関数と算術演算子の組み合わせ

# 組み込み関数abs()と算術演算子の組み合わせ
number = -10
absolute = abs(number) + 5
print(absolute)  # 出力: 15

# 組み込み関数round()とべき乗演算子の組み合わせ
value = 3.14159
rounded_power = round(value ** 2, 2)
print(rounded_power)  # 出力: 9.87

# 組み込み関数pow()と剰余演算子の組み合わせ
base = 2
exponent = 5
modulus = 3
result = pow(base, exponent) % modulus
print(result)  # 出力: (32) % 3 = 2

実行結果

15
9.87
2

解説

  • abs(number)-10の絶対値である10を返し、それに5を加えて15を出力します。
  • value ** 23.14159の2乗を計算し、round(..., 2)で小数点以下2桁に丸めて9.87を出力します。
  • pow(base, exponent)2の5乗を計算し、% modulus323で割った余り2を出力します。

例:標準ライブラリmathと算術演算子の組み合わせ

import math

# math.sqrt()と算術演算子の組み合わせ
number = 49
square_root = math.sqrt(number) * 2
print(square_root)  # 出力: 14.0

# math.floor()と算術演算子の組み合わせ
value = 7.89
floored = math.floor(value) + 1
print(floored)  # 出力: 8

# math.ceil()と算術演算子の組み合わせ
value = 3.14
ceiled = math.ceil(value) - 1
print(ceiled)  # 出力: 3

実行結果

14.0
8
3

解説

  • math.sqrt(number)49の平方根7.0を計算し、それに2を掛けて14.0を出力します。
  • math.floor(value)7.89を切り捨てて7を取得し、それに1を加えて8を出力します。
  • math.ceil(value)3.14を切り上げて4を取得し、それから1を引いて3を出力します。

5.注意点

数値を扱う際には、以下の点に注意する必要があります。

5.1. 整数と浮動小数点数の違い

  • 整数(int)は、ゼロまたは負の値を含む任意の大きさの整数です。
  • 浮動小数点数(float)は、小数点以下を含む数値で、精度に限界があります。

サンプルプログラム

1010.0がどのようなデータ型であるのかを確認します。

# 整数と浮動小数点数の違い
integer_num = 10
float_num = 10.0

print(type(integer_num))  # 出力: <class 'int'>
print(type(float_num))    # 出力: <class 'float'>

実行結果

ポイント

  • 演算子によっては、整数と浮動小数点数の間で結果の型が変わることがあります。
  • 浮動小数点数は、計算誤差が生じる可能性があるため、精度が重要な場合は注意が必要です。

5.2. 負数に対する演算子の挙動

 負数に対する除算/や整数除算//、剰余%の結果には特有の挙動があります。特に、整数除算//は負数に対して期待とは異なる結果を返すことがあります。

サンプルプログラム

# 負数に対する整数除算と剰余
a = -7
b = 3

result_floor_div = a // b
result_mod = a % b

print(result_floor_div)  # 出力: -3
print(result_mod)        # 出力: 2

# 計算の関係性確認
print(a == (result_floor_div * b + result_mod))  # 出力: True

実行結果

-3
2
True

解説

  • -7 // 3-3となります。これは、-7 / 3-2.333...であり、floor関数により-3に丸められるためです。
  • -7 % 32となります。これは、-7 == (-3) * 3 + 2が成立するためです。

ポイント

  • 負数を含む演算では、結果が直感的でない場合があるため、事前に計算方法を確認することが重要です。
  • //%の結果は、A == (A//B)*B + (A%B)の関係を満たします。

5.3. 浮動小数点数の精度

 浮動小数点数は、有限のビット数で表現されるため、無限に続く小数や非常に大きな数値を正確に表現することができません。これにより、計算結果に微小な誤差が生じることがあります。

サンプルプログラム

# 浮動小数点数の精度
value = 0.1 + 0.2
print(value)          # 出力: 0.30000000000000004
print(value == 0.3)   # 出力: False

実行結果

0.30000000000000004
False

解説

  • 0.1 + 0.2の結果は厳密には0.3ですが、浮動小数点数の精度の関係で0.30000000000000004となります。
  • このため、浮動小数点数の比較には注意が必要です。

ポイント

  • 浮動小数点数の計算誤差を避けるために、丸めやフォーマットを使用して結果を整形することが推奨されます。
  • 精度が重要な場合は、decimalモジュールなどを利用することで、より高精度な計算が可能です。

例:decimalモジュールの使用

from decimal import Decimal

# Decimalを使った高精度な計算
a = Decimal('0.1')
b = Decimal('0.2')
result = a + b
print(result)          # 出力: 0.3
print(result == Decimal('0.3'))  # 出力: True

実行結果

0.3
True

解説

  • Decimalクラスを使用することで、浮動小数点数の精度誤差を回避し、正確な計算結果を得ることができます。

まとめ

ここでは、Pythonにおける数値を使った計算の基本について学びました。

  • 算術演算子:加算、減算、乗算、除算、整数除算、剰余、べき乗、行列積などの基本的な演算子の使い方を理解しました。
  • 演算子の優先順位:演算子の評価順序を理解し、複雑な式を正確に評価する方法を学びました。
  • 関数と演算子の組み合わせ:組み込み関数や標準ライブラリの関数と演算子を組み合わせて、より複雑な計算を行う方法を習得しました。
  • 注意点:整数と浮動小数点数の違いや、負数に対する演算子の挙動、浮動小数点数の精度に関する注意事項を確認しました。

 これらの知識を基に、Pythonでの数値計算を効率的かつ正確に行うことができるようになります。次のコンテンツでは、演算子の優先順位についてさらに詳しく解説していきます。ぜひ、実際にコードを書きながら、数値計算の理解を深めてください。