0.はじめに
プログラミングや数学でよく聞く関数ですが,初心者のうちは使いこなすのが難しく,ついユーザー定義関数を使わずメインメソッドだけでゴリ押ししてしまうことも多いのではないでしょうか.
本記事では,そんな方々が「関数」について理解を深め,プログラミングでも自在に活用できるようになることを目指して解説します.
1.関数の定義
・関数とは,ある変数に依存して決まる値,あるいはその対応を表す式である.
(引用:Wikipedia)
上記の定義は,一般的に数学で用いられる関数の定義ですが,プログラミングにおける関数も概ね同じ意味でつかわれる為,この定義を引用しました.
しかし「関数」についてご存じの方ならばすんなり理解できるかもしれませんが,初心者からしてみれば,この説明は抽象的で理解しにくいと思います.
そのため定義を私なりに言い変えてみました.
・ 関数とは,入力に対してあるルールに従い出力を決める対応関係を指す.
例えば,下図のような関係があったとします.
これは「3つ葉がfという名前の土管を通過したら4つ葉になった.」という図で,この関係が関数です.
・「3つ葉」は,上記の定義でいう「入力」で,
・「4つ葉」は,上記の定義でいう「出力」で,
・「土管」は,上記の定義でいう「ルール」を指します.
注意
数学的には3つの関係をまとめて「関数」というのであり,ルールそのものは関数ではありません.
ただしプログラミングにおいてはルールそのものを関数と呼ぶようです.
ルールの名前は自由に決めてよいですが,一般に関数の英語表記functionの頭文字を取ってfと名付けることが多いです.ここで「ルールに名前を付ける」とは,例えば「日本国民が生きる上での禁止行為」をまとめたルールを「日本国憲法」と名付けている感覚です.
これらの関係を数式で表すと,みなさんご存じこのような表記になります.
括弧内の「入力」された値が「ルール f」により「出力」の値になる.という感じですね.
この数式全体が「関数」です.ここで数学においては「入力」の値は自由に変えることができるため変数といわれ,その変数により決まる出力のことを値と呼ばれます.
また,プログラミングにおいては変数のことを引数,値のことを戻り値と呼びます.
2.関数の制約
関数の定義についてはご理解いただけたでしょうか.この章は若干余談が入ってしまいますが,関数の制約について説明をしていきます.
先ほどの図は
「3つ葉が,あるルールに則って4つ葉になった.」という関数を指していますが,
その「ルール」とは一体なんでしょうか.ぜひ少し考えてみてください.
正解は...
わからない です.
「葉っぱの枚数を1枚増やす」というルールを思い浮かべた人も多いと思います.
では例えば「葉っぱの枚数を4/3倍にする」というルールだったらどうでしょう.
あるいは「葉っぱの枚数を5/3倍にしてから1枚減らす」だったら?
結果は同じく3つ葉はそれらのルールに則っても4つ葉になりますよね.
すなわちこの例でのルールの特定は,考えられるルールが無限にあるため不可能です.
ではここで「n枚の葉っぱがあるルールに則ってn+1枚になった」という関数を考えます.
この関数における「ルール」はなんでしょう.
実はこの場合は 「葉っぱの枚数を1枚増やす」というルールだと特定することができます.
前者の例は数式で表すと
f(3) = 4
に対して,後者の例は
f(x) = x + 1
と表すことができます.
ここで入力と出力が具体的な数である前者は特殊解といい,入力と出力が一般化された数である後者を一般解と呼ぶことにします.
警告
「一般解」や「特殊解」は微分方程式などで使われる単語で,実際の正式な意味とは異なります.当記事では便宜上こう呼ぶことにしています.ご了承ください.
そして基本的に,特殊解から一般解を求めることは上記の通り不可能です.実験レポートなどで,測定結果のグラフを書く際に,プロット点とプロット点を線で結ぶのはOKでも,実験範囲外にまでその線を延長することがNGなのは,そういった関係がある為だと思います.(プロット点は特殊解であり,測定範囲内では,結ばれた線に沿うというルールだと仮定できるが,測定範囲外までの延長は一般解を求めることと同義であるため)
3.プログラミングで「関数」を書いてみよう.
では例えば「任意の自然数nに1を足す関数add_one」をPythonで記述します.
def add_one(n):
n = n + 1
return n
print(add_one(2)) #出力は3
add_oneが関数の名前で,括弧内nは入力です.
そしてdefのインデント内が,「入力nがどう変わるかのルール」を定義しており,
それに従いreturn文で出力が定められています.
ここで,このdefにより定義している関数部分は一般解になっていることに注目してください.
一方で,print(add_one(2))という部分では特殊解を出力しています.
4.関数を扱う上で意識してほしいこと
関数の定義部分では一般解,出力では特殊解を扱う点を意識すると関数が使いやすくなると考えます.
どういうときに関数を使うか悩む場合は,上記の図を参考に,関数を「入力したものを変換し出力するコンバーター(変換器)」のようなものだという意識をもつとよいと思います.具体的には写像の考え方に近くなりますが,それはまた次回.
5.おわりに
今回説明した「関数」は正式に言うと,入力(変数)が一つしかない一変数関数ですが,
ほかにも,入力(変数)が複数ある多変数関数があります.それについても次回触れます.
初めての投稿なので拙い記事だったと思いますが,ご精読ありがとうございました.
ではまた.