関数
関数とは同じ処理をまとめたもの
プログラムを書いていく中で、必要な処理が増えてくるとそれに比例して、プログラムの量も多くなってきます。プログラムの量が増えてくれば、同じような処理をする箇所が出てきます。
同じような処理の例として、実際によくある処理ですが、プログラムの処理の途中で処理の経過をファイル(ログファイル)に出力したいとします。
一般的にログファイルには、処理がいつ発生したかを記録するために、現在日時を書き込みます。
ログファイルへの現在日時の書き込みは以下のような流れだとします。
- ログファイルを開く。
- 現在日時を取得する。
- ログファイルに現在日時を書き込む。
- ログファイルを閉じる。
ログファイルの書き込みを行う度にプログラムに一連の内容を何度も記述するのは非効率です。そこで、この一連の処理をまとめて記述する、「関数」という仕組みがあります。
関数には名前を付ける
関数には名前(関数名)を付けなければなりません。関数名をプログラムの中で書くことで、その関数に書かれている一連の動作が実行されます。
関数名は一般的には小文字の英単語を使います。単語が複数ある場合はアンダースコアでつなげて書きます。
例:「check_data」「output_log」
以下は「sub」という名前の関数を呼び出す例です。6行目が呼び出している箇所になります。1行目から4行目までのsub()関数の中ではPythonで最初から利用できる関数であるprint()関数を使って、”aaa”、”bbb”、”ccc”を出力しています。
1 2 3 4 5 6 |
def sub(): print("aaa") print("bbb") print("ccc") sub() |
なお、Pythonではlambda演算子を使うことで名前のない関数のような書き方もできますが、lambda演算子は利用用途が少ないためここでは省略します。
関数を作る目的
関数を作成する上で一番大事なことは、なぜその関数を作る必要があるかを理解することです。このことを理解しているかどうかで、プログラムを書くレベルに大きな差となって現れます。
関数を作る一番の目的は「プログラムを理解しやすくする」ことです。
プログラムを理解しやすくする方法は1つしかありません。理解しやすいように努めることです。「当たり前だろ」と言われそうですが、それが出来ていないプログラマーが多数います。そして、そのようなプログラマーが書いたコードを見て、世界中で「このコードは何がしたいのか全然わからん!」と叫ばれています。
理解しやすく務めることの中でも重要な1つがプログラムをできるだけ短くすることです。これはPythonに限らずどんなプログラミング言語でも同じです。
プログラムが短ければ短いほど、何をやっているのかが把握しやすくなります。関数を作る目的はここにあります。業務とは直接関係ない処理や複雑な処理を関数として隠蔽してしまえば、プログラム全体の流れを把握する手助けになります。
書籍などでは関数の説明では「一連の処理をまとめる仕組み」とか「再利用することが出来るようになる」ということを挙げられることが多いのですが、それは関数を作った結果の話であって、関数を作る目的ではありません。
関数の作り方の参考例
関数を作成する上で、参考になるものがあります。それは市販の料理のレシピです。
カレーのルウの箱には作り方が書いてあります。これはプログラムの関数化を考える上でとても参考になります。大体こんな感じで書いてあります。
- 炒める(鍋にサラダ油を引いて一口大に切った具材を中火で炒める)
- 水を入れて煮込む(あくを取りながら具材が柔らかくなるまで20分程度煮込む)
- ルウを入れる(火を止めてルウを割って入れる)
- 煮込む(弱火でかき混ぜながら5分煮込む)
この4つがそれぞれ関数です。括弧の中が処理内容です。「炒める」関数の中には実際には具材を切って、鍋に油を引いて、具材を炒めて、といった内容が隠蔽されています。他の3つも同様です。
関数4つ「炒める」「水を入れて煮込む」「ルウを入れる」「煮込む」という短い内容でも全体像は分かります。例えば、具材を変えたい場合は「炒める」関数の工程を変えればいい、という判断ができます。
しかし関数4つを全部展開して書いてあると、全体像を理解するのに時間が掛かり、また、変更を行う場合にどこに変更を加えればいいのか判断しにくくなります。
カレーを作り方を理解しやすくするために、このパッケージを作る努力をかなりなされていると思います。実際には作業工程では「野菜を切る」という関数があってもいいかもしれませんが、「炒める」に含まれています。
このように、どんな関数を作った方がより良いプログラムになるか、ということを考えることが出来るようになると、一つ上のプログラマーになることが出来ます。