こんにちは、機械学習の講師をしている竹内です!
今回は Python の関数について解説します。関数は登場頻度が非常に多いため、コード自体を見たことがある方は多いかと思います。
def calc(numbers):
odd, even = [], []
for number in numbers:
if number % 2 == 0:
even.append(number)
else:
odd.append(number)
return even, odd
「関数の書き方はなんとなくわかるけれど、どんなときに使用すればよいかわからない」という方もいらっしゃるかと思いますので、今回はなぜ関数が必要なのかという点も合わせてお伝えします!
ぜひこの機会に関数をご自身で作れるようにしていきましょう!
実行環境
- Google Colaboratory
- Python:3.9.2
関数が必要な背景
関数が必要な理由は「複雑な処理を何度も記述するのが大変だから」です。例えば以下のような処理があったとします。
a = [1, 2, 3, 4, 5]
b = 0
for i in a:
b = i + b
b
--- 以下実行結果 ---
15
上記は 1 ~ 5 までの整数を足し算するコードです。

処理はシンプルですが、足し算を行う度に上記のコードを書いた場合はどうでしょうか。
# 以下の a, b, c の合計が知りたい
a = [1, 2, 3, 4, 5]
b = [1, 10, 100, 1000]
c = [5, 10, 15, 20, 25]
d = 0
for i in a:
d = d + i
e = 0
for i in b:
e = e + i
f = 0
for i in c:
f = f + i
d, e, f
--- 以下実行結果 ---
(15, 1111, 75)
処理の内容は単純なはずですが非常に理解しにくいのではないでしょうか。
このように何度も同じ処理を書くと他の方がコードを見る際や将来の自分がコードを見る際に非常にわかりにくくなります。
ここで関数を使用すると、同じ処理の内容をまとめることができるため以下のように記述できます。
# 以下の a, b, c の合計が知りたい
a = [1, 2, 3, 4, 5]
b = [1, 10, 100, 1000]
c = [5, 10, 15, 20, 25]
d = sum(a)
e = sum(b)
f = d = sum(c)
d, e, f
--- 以下実行結果 ---
(15, 1111, 75)
先程よりも内容が完結に伝わりやすくなったのではないでしょうか。このように関数を用いることで繰り返し処理を完結に記述できます。
sum()
関数を 3 回繰り返しているためわかりにくいと思う方もいらっしゃるはずです。その時は for 文を利用するとより完結に記述できます。# 以下の a, b, c の合計が知りたい
a = [1, 2, 3, 4, 5]
b = [1, 10, 100, 1000]
c = [5, 10, 15, 20, 25]
num_list = [a, b, c]
ap_list = []
for i in num_list:
ap_list.append(sum(i))
ap_list
--- 以下実行結果 ---
[15, 1111, 75]
今回は sum()
関数を 3 回しか使用しないためコード量の変化はあまりありませんが、sum()
関数を 100 回使うシチュエーションを想定した場合は上記の方が簡潔であることがわかります。
関数の書き方
関数の書き方をお伝えします。まずはルールから押さえましょう。
関数は上図のように記述します。「def 関数名」は「関数名」の関数を定義する (define) という意味合いです。引数とは関数に対する入力値を表します。最初はイメージがつきにくいと思いますので言葉だけ押さえておいてください。
またアンダーバー(アンダースコア)が 4 つ並んでいる箇所がありますが、こちらはインデントと呼ばれる空白スペースになります。この空白スペースがあることでどこまでが関数の内容なのかを判断できます。
def 関数名(引数1, 引数2, ...):
処理
処理
処理
--- ここまでが関数のまとまり ---
a = [1, 2, 3]
関数の作成(引数なし)
まずは入力(引数)のない関数を作成してみましょう。
関数を作成する際はいきなりヘッダーの部分から書き始めるのではなく、関数化したい処理を先に記述すると作成しやすいです。今回は文字列を表示させたいので処理内容は以下です。
# 処理を確認
print('私の名前は田中太郎です。')
--- 以下実行結果 ---
私の名前は田中太郎です。
処理が確認できました。それでは関数化していきましょう。
まずは処理の内容の先頭行を 1 つあけ、その後インデントとして空白スペースを開けます(設定により半角スペース 4 つ分の時もあれば空白スペース 2 つ分の時もあります。)
# 先頭行をあける
print('私の名前は田中太郎です。') # 処理にインデント(半角スペース)を設ける
インデントをつける際は、インデントをつけたいコード上にカーソルを置き、tab キーを押すことでインデントをつけることも可能です。(こちらが非常に便利です。)
それでは上 1 行の部分にヘッダーを記述します。関数名は基本的には何でも構いません。
元々定義されているものを予約語と呼びますのでこちらも覚えておいておくとよいでしょう。
ヘッダーを記述したものを以下に記載します。
# 関数化
def introduce():
print('私の名前は田中太郎です。')
関数を作成できました。しかし関数は定義されただけでは実行されません。
定義した関数を使用するためには定義を行うコードとは別に、関数を実行するためのコードを記述する必要があります。
それでは関数を実行してみましょう。
# 関数の実行
introduce()
--- 以下実行結果 ---
私の名前は田中太郎です。
このように関数を自作することができました!しかしこの関数では田中太郎さんしか使用できない関数になってしまいます。
そこで名前の欄を適宜入力する値によって変更できるようにすることで、誰でも使用できる関数にしてみましょう。この時に引数を使用します。
関数の作成(引数あり)
それでは関数を書いてみます。
# 名前を指定できるように変更
def introduce(name):
print('私の名前は' + name + 'です。')
上記のように、適宜変更したい部分に変数(今回の場合は name)を置きます。(こちらも名前はなんでも構いません。ただし既出の名前は避けるようにしてください。)
そしてヘッダーの ()
の中に定義した変数をいれることによって、関数を実行する際にその変数に値を渡せます。
それでは実行してみましょう。
# 関数の実行
introduce('田中二郎')
--- 以下実行結果 ---
私の名前は田中二郎です。
上記の関数では name
という引数に 田中二郎
という文字列が代入され、その後 print()
関数の中で name
が使用された状態を表しています。
print()
関数のように事前に Python で定義されている関数を組み込み関数と呼びます。私達が 1 から全てコードを組むことは非常に大変ですが、事前に定義されている関数をうまく使用することで複雑なコードも簡単に記述できます。
何か新しい実装を行う際は、その処理を行える関数が既に用意されていないかを探してみるのもとても大切です。
最後に
いかがでしたでしょうか。今回お伝えした内容をまとめます。
- 関数を使用することで「複雑な処理を何度も記述する」ことを簡単にできる。
- 関数を作成する際は一度処理の内容を確認してから、インデントとヘッダーの作成を行う。
- 引数を使用することで、処理内容の一部を実行時に適宜変更できる。
関数の機能を少しでも身近に感じていただければ幸いです。
また動画で関数の内容を学習したい!という方は、元副社長の動画がおすすめです。
以上、Python 学習している方々のお力添えになれば幸いです!
参考リンク
参考 Python 3.9.2 ドキュメント大人気コース「Python & 機械学習入門コース」が無料!
現在 e ラーニングプラットフォーム「キカガク」に無料登録すると、これまで多くの方にご受講いただいた、Python の基礎から機械学習の数学やプログラミングまでを学べる大人気コース「Python & 機械学習入門コース」が無料です。
好評である手書きの数学とハンズオン形式のプログラミングを通じて、初学者でも数学の理論から実装まで一から学習できます。また、動画で丁寧に解説しているため、迷うことなく最後まで継続して学習しやすいです。
Python の基礎から機械学習を学習したい方は、ぜひ教材の1つとしてご利用ください!