関数を使った数値計算

Pythonでは演算子を使った四則演算やべき乗だけではなく、関数という機能を使って、高度な計算をすることができます。excelのsum関数やabs関数と同じようなものと考えられます。

関数には、pythonを起動すればすぐに使える組み込み関数や、使うときに手続きが必要なものもあります。

組み込み関数

関数のうち、よく使われることが想定されるものは、組み込み関数といわれpythonを起動するだけで使うことができます。組み込み関数のうち、数学的な計算でよく使う関数を取り上げます。

pow関数

pow関数ではべき乗の計算をすることができます。べき乗は**演算子でも計算することができますが、pow関数を使うことにより、べき乗であることを明らかにすることができます。ちなみにpowとはべき乗のpowerの略と考えられます。

pow関数と**演算子によるべき乗の計算

  1. x_pow=pow(2,3)
  2. x_operator=2**3
  3. print(x_pow,x_operator,x_pow is x_operator)
8 8 True

1.ではpow関数、2.では**演算子でべき乗の計算をしています。いずれも整数で計算されます。

3 両者の結果を比較すると数値もデータの形式も等しいことがわかります。

平方根やマイナスのべき乗の計算

数学的には、0.5乗(1/2)乗は平方根、マイナス乗は1/べき乗nの値を計算することができます。

pow関数による平方根、マイナスのべき乗の計算

  1. print(pow(2,0.5))
  2. print(pow(8,1/3))
  3. print(pow(2,-1))
1.4142135623730951
2.0
0.5

1. 0.5乗とすると、平方根を計算することができます。

2. べき乗するときに、小数だけではなく、分数も指定することができます。1/3乗とすると3乗根を計算します。

3. べき乗するときに、マイナスを指定すると、べき乗した値を分母とする値を計算します。

組み込み関数のpow関数の便利機能

pow関数には3つめの引数を指定することができ、べき乗の結果をその数で割った余りを返してくれます

pow関数を使ったべき乗に対する余りの計算

  1. pow(2, 3, 5)
3

1. 2の2乗である8を5で割った値が3になります。

一見すると何に使うかのか、という気もしますがオイラーの定理など代数学の計算をするときには便利です。

abs関数

abs関数を使うと絶対値を計算することができます。

abs関数で絶対値を計算する

  1. n_int = -1
  2. n_float = -2.3
  3. print(abs(n_int))
  4. print(abs(n_float))
1
2.3

1. 負の整数を変数n_intに代入しabs関数を適用すると、正の整数に変換されます。

2. 負の小数を変数n_floatに代入しabs関数を適用すると、正の小数に変換されます。

sum関数と変数の名前の注意事項

リストなどの数値の合計を計算するsum()関数

数学的な関数とは少し異なりますが、最もよく使う関数はsumです。sum関数はリストなどの数値の合計を返します。

sum関数でリストの合計を計算する

  1. num_l=[1, 2, 3, 4, 5]
  2. print(sum(num_l))
15

sum()関数のような組み込み関数について注意すべきことがあります。例えば、次のような合計を求めるプログラムで、合計という意味を込めて”sum”というような変数を使いたくなります。このプログラム自体は何ら問題なく実行できますが、次にsum関数を使うとエラーになってしまいます。

sumという変数を定義すると

  1. sum= 0
  2. for i in range(5):
  3. sum += i
  4. print(sum)
  5. sum(num_l)
10
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_12544\4174842795.py in 
      3     sum += i
      4 print(sum)
----> 5 sum(num_l)
      6 
TypeError: 'int' object is not callable

pythonには予約語という、あらかじめ別の用途に使う名前があります。この名前の変数などを定義しようとするとエラーになります。

なるので、質が良いといえます。ところが、組み込み関数は、その名前の変数などを定義しようとすると、エラーも警告も出ることなく、組み込み関数の機能を使えなくしてしまうのでやっかいです。

このような場合は、次の通り、独自に定義したsumという変数を削除すれば元の通りsum関数を使うことができます。

定義したsum関数を削除する

  1. del(sum)
  2. sum(num_l)
10

del文を使い、先ほど定義した変数sumを削除すると、組み込み関数のsum()が復活します。また、それでもうまくいかないときは、いったんpython全体を(そのプログラムではなく)を終了し、再度起動することでもとに戻ります。いつも使っている関数が突然動かなくなる時には、この問題が関わっている可能性があります。

標準パッケージ

pythonには豊富な機能が満載されていますが、中にはすべての人が使うとは思えないようなものも含まれています。pythonを起動したときに、そのすべてを主記憶装置に呼び込み使えるようにしようとすると、余計な時間がかかってしまうなど無駄が生じます。そこで、使うときだけimportという機能を使うことのより呼び出して使う標準パッケージというものが数多く用意されています。その一つがmathモジュールです。mathモジュールには数学的な計算をするためには必須な関数が含まれていますが、pythonを使う人みんながいつも使うわけではありません。そこで、mathモジュールを使うためには、importという する必要があります。実例をいくつかご紹介します。

mathモジュール

mathモジュールのsqrt関数を使うと平方根を計算することができます。**演算子でも同じ結果になりますが、平方根であることを明らかにすることができます。

mathモジュールをimportしてsqrt関数を使う

  1. import math
  2. x_sqrt = math.sqrt(2)
  3. x_oper = 2**0.5
  4. print(x_sqrt, x_oper, x_sqrt == x_oper)
1.4142135623730951 1.4142135623730951 True

1. mathモジュールを使うためには、import文により、使うことができるようにする必要があります。

2. sqrt関数を使うときにはmath.sqrtとしmathモジュールのsqrt()関数であることを明らかにする必要があります。

pythonでは、変数や関数などの名前を管理する表(symbol table)が作成されます。このとき、importされたmathモジュールとpython本体では別の表が作られます。このため、sqrt関数を使うときには、「mathモジュールの表を見に行きます」、ということを示すためにmath.を付ける必要があるわけです。

from~import 関数名による方法

関数を使うもう一つの方法は、関数をpython本体の表の中にsqrt関数をimportすることです。

from~import

  1. from math import sqrt
  2. sqrt(2)
1.4142135623730951

1. mathモジュールの内のsqrt関数をimportする旨を宣言します。

2. sqrt関数をつかうことができます。このとき、math.は必要ありません。

この方法はpython本体の名前を管理する表の中に、mathのモジュールの関数名なども取り込んでしまいます。このため、実行するときに敢えてmathを付ける必要はありませんが、本体とmathモジュールに同じ名前があるときは、本体の方が上書きされてしまい使えなくなってしまいます。

from モジュール import *を使う方法

from モジュールを使う方法で、import *とする方法があります。この方法によると、モジュールにあるほとんどすべての関数を使うことができます。この例でいうと、mathモジュールにあるすべての関数を本体の表にimportすることができるわけです。

trunc関数はmathモジュールの一つですが、上記の方法によりmath.を付けずに使うことができます。

この方法はとても便利ですが、落とし穴もあります。

ところが、mathモジュールにもpow関数が存在します。そこで

pow関数がエラーになる

  1. from math import *
  2. pow(2, 3, 5)
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_17888\3456829954.py in 
      1 from math import *
----> 2 pow(2,3,5)

TypeError: pow() takes exactly 2 arguments (3 given)

1. mathモジュールにある関数と本体の関数の名前が同じ場合、本体の関数が使えなくなります。

2. mathモジュールのpow関数には3番目の引数を指定する機能はありません。このためエラーになってしまいます。

このように、この便利な方法は思わぬところで影響が出る恐れがあります。

関数の入力を楽にする方法

from モジュールから関数をimportするのはいろいろ問題がありそうです。import mathとして名前の表を別々に管理するのが確実ですが、一方でこの方法は関数の入力に手間がかかります。そこで、手間を省く方法として、mathモジュールなどの関数を別の名前でimportする方法があります。

関数の入力を楽にする方法

  1. from math import sqrt as r
  2. r(2)
1.4142135623730951

1. importする際にas 名前とすると、その名前で関数を使うことができます。もちろんrのような変数名も、他の関数などと重複しないように気を付ける必要がありますが、入力の手間が省く方法として有益です。

2. rにmathモジュールのsqrt関数が代入され、正しく計算されたことがわかります。