みなさんコードを書く際に、しっかりと同じ処理を関数でまとめていますか?
関数というのは、一度設定した命令を何度も使いまわせるように、処理一式をまとめたパッケージです。
関数を使いこなすと、ソースの量をグッと減らせるだけではなく、リファクタリング(後からプログラムを修正すること)もしやすくなります。
そんな便利な関数(def)と、関数の応用的な使い方である無名関数(lambda)を解説します。
関数(def)

関数の使い方は非常にシンプルで、defの後に関数名を自由に宣言して、もし、関数内に情報を与えたい場合は引数に値を代入します。そうすると、関数が呼ばれた場所で、与えられた引数に応じて、処理をしてくれて、戻り値を取得することが出来ます。
実際にソースをみたほうが、理解が早いと思いますので、以下で三角形の面積を求める関数を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#三角形の面積を求める def triangle(bottom, height): area = bottom * height / 2 result = "底辺:" + str(bottom) + ", 高さ:" + str(height) + "の三角形の面積は" + str(area) + "です。" return result print(triangle(10, 20)) #結果 底辺:10, 高さ:20の三角形の面積は100.0です。 print(triangle(20, 20)) #結果 底辺:20, 高さ:20の三角形の面積は200.0です。 print(triangle(10, 5)) #結果 底辺:10, 高さ:5の三角形の面積は25.0です。 |
このように三角形の面積を求める関数(triangle())を作って、そこに底辺と高さを代入すれば、たったの一行で三角形の面積を得ることができます。
そして、関数のいいところは、一度宣言してしまえば、その関数を色々なところで何回も使用できるということ。もし、数学に関するアプリのプログラミングをしていたとしたら、三角形の面積を求めるシーンは何度も登場します。そんなときに、毎回三角形の面積を求める式を記述していたら、思わぬミスに繋がる可能性がありますし、何よりもめんどくさいです。
また、後からプログラムを検証しているときにミスを発見したらどうなるでしょう。もし、関数を使用せずに、プログラムの各所に三角形を求める式を記述していたとしたら、すべてのプログラムを見直して、すべての記述を修正しなければなりません。
しかし、関数を利用していれば、関数内のミスを修正して、すべてのプログラムに反映させることができます。
可変長引数をもつ関数
関数の便利さは十分伝わったと思います。そこで、引数をいくつ持つかわからない(可変長引数)関数も紹介します。
例えば、複数の数字をすべて合計したい関数を作るとします。先程の例ですと、与えられる引数は関数の宣言時に規定されているので、いくつの数字を合計するかわからない状態だと、
- 2つの数字を合計するために、2つの引数をもつ関数(def sum(a, b):)
- 3つの数字を合計するために、3つの引数をもつ関数(def sum(a, b, c):)
- 4つの数字を合計するために、4つの引数をもつ関数(def sum(a, b, c, d):)
- …
と、たくさんの関数宣言をしないといけません。
しかし、引数の前に「*(アスタリスク)」を記述すれば、たった1つの関数で複数の値を処理できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#与えられた数字の合計をもとめる def sum_numbers(*numbers): result = 0 for i in numbers: result += i return result print(sum_numbers(10, 20)) #結果 30 print(sum_numbers(10, 20, 30)) #結果 60 print(sum_numbers(10, 20, 30, 40)) #結果 100 print(sum_numbers(10, 20, 30, 40, 50)) #結果 150 |
このように、可変長引数に複数の値を代入すると、関数内でそれらの値をタプルとして処理してくれます。タプルで関数内に値が渡されたら、あとは、for文を使って、合計値を求めましょう。
以上のように、関数を利用すれば、プログラムを健全な状態に保ち、きれいなソースを書くことができます。
無名関数(lambda)

関数を一通り説明したので、これからは無名関数(lambda)を解説します。
無名関数(lambda)は文字の通り、関数名をもたない関数です。関数名をもたないため、変数に関数を代入したり、直接戻り値を渡す際に利用します。
こちらも三角形の面積を求める例を以下に示します。
1 2 3 4 5 |
#三角形の面積を求める triangle = lambda bottom, height: bottom * height / 2 print(triangle(10, 20)) #結果 100.0 |
triangleという変数に、無名関数を使って三角形の面積を求める関数オブジェクトを代入しています。
この式を見ていただくと分かる通り、無名関数を使えば、たったの一行で関数を使えます。
一見、わかりづらいし、関数(def)だけ使えればいいんじゃないの?と思うかもしれませんが、lambdaは1行で簡潔に関数を表現することが出来る記法です。
そのため、リストの処理を行うmap()関数やfilter()関数といった他の関数と組み合わせてつかうことで、その真価を発揮します。
一旦は、こういう書き方があるんだと、無名関数も覚えておいてください!
プログラムを勉強していくと、ここは無名関数で記述した方がスッキリするな!という場面に何度も遭遇すると思います。
関数化するという考え方はプログラムの基本
- 同じ処理を何度も記述しない
- リファクタリングしやすいコードを書く
- 冗長化しないために、機能ごとにモジュール化する
など、プログラムの基本的な考え方を実現するために、関数は必須の技術です。
この関数をしっかりと理解すれば、他人の書いたコードを読解する力も飛躍的に向上します。焦らず、ゆっくりと勉強していきましょうね!