【Python 入門】関数の作り方についてやさしく解説!関数を自作できるようになろう!

function_basic

こんにちは、機械学習の講師をしている竹内です!

今回は Python の関数について解説します。関数は登場頻度が非常に多いため、コード自体を見たことがある方は多いかと思います。

関数の例
def calc(numbers):
    odd, even = [], []
    for number in numbers:
        if number % 2 == 0:
            even.append(number)
        else:
            odd.append(number)
    return even, odd

上記のようなコードを見て「無理!わからない!」となってしまう方も多いと思います。

本記事では関数とは?といったところから、関数の作り方まで解説いたします!

ぜひこの機会に関数をご自身で作れるようにしていきましょう!

実行環境

関数とは?

プログラミングにおける関数とは、与えられた値をもとに一定の処理をしてその結果を返す命令のことをいいます。

普段の生活から身近な例で説明します。

与えられた「天気」を受けとって「荷物」を返す関数を作るとします。

関数を定義する
# 関数名(与えられる値): といったように表記
持っていく傘を判別する(天気) :
	荷物 = [財布]
	
	天気 = 雨 :
		荷物に傘を追加
	天気 = 晴れ :
		荷物に日傘を追加

	return 荷物

関数を実行する
# 関数を実行する(今回は雨という値を与える)
荷物 = 持っていく傘を判別する(雨)

# print は画面に表示するプログラム
print(荷物)

実行結果
# 雨なので荷物に傘が追加される
財布、傘

このように「今日の天気」という引数を受け取って、荷物に傘を追加するのか、日傘を追加するのかといった判別するプログラムが書けました。

ここからもう一歩踏み込んで説明します。

関数が必要な背景

関数が必要な理由は「複雑な処理を何度も記述するのが大変だから」です。

例えば以下のような処理があったとします。

コードについては詳しく見なくても大丈夫です。今の段階では足し算をするんだというように思ってもらっておいて大丈夫です。

整数の足し算
整数の足し算
a = [1, 2, 3, 4, 5]
b = 0

# a をすべて足し算する
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
# a をすべて足し算する
for i in a:
    d = d + i

e = 0
# b をすべて足し算する
for i in b:
    e = e + i

f = 0
# c をすべて足し算する
for i in c:
    f = f + i

d, e, f
--- 以下実行結果 ---
# a, b, c の合計
(15, 1111, 75)

処理の内容は単純なはずですが非常に理解しにくいのではないでしょうか。

このように何度も同じ処理を書くと他の方がコードを見る際や将来の自分がコードを見る際に非常にわかりにくくなります。

ここで関数を使用すると、同じ処理の内容をまとめることができるため以下のように記述できます。

整数の足し算
整数の足し算
# 以下の a, b, c の合計が知りたい
a = [1, 2, 3, 4, 5]
b = [1, 10, 100, 1000]
c = [5, 10, 15, 20, 25]

# 与えられた値を合計する関数
def sum(numbers):
  total = 0
  for i in numbers:
    total = total + i
  return total

d = sum(a)

e = sum(b)

f = d = sum(c)

d, e, f
--- 以下実行結果 ---
(15, 1111, 75)

今回は足し算をするための sum といった関数を用意し、それを使うことで非常に簡単に書けるようになりました。このように関数を用いることで繰り返し処理を完結に記述できます。

補足

上記のコードも 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 回使うシチュエーションを想定した場合は上記の方が簡潔であることがわかります。

補足

for 文について理解を深めたい方は以下の記事を参考にしてください。

関数の書き方

関数の書き方をお伝えします。まずはルールから押さえましょう。

function

関数は上図のように記述します。「def 関数名」は「関数名」の関数を定義する (define) という意味合いです。引数とは関数に対する入力値を表します。最初はイメージがつきにくいと思いますので言葉だけ押さえておいてください。

またアンダーバー(アンダースコア)が 4 つ並んでいる箇所がありますが、こちらはインデントと呼ばれる空白スペースになります。この空白スペースがあることでどこまでが関数の内容なのかを判断できます。

関数のサンプル
def 関数名(引数1, 引数2, ...):
    処理
    処理
    処理

--- ここまでが関数のまとまり ---

a = [1, 2, 3]

引数とは

ここでいう引数とは簡単に説明すると関数に渡す「値」のことです。

一番最初の持つ傘を判別する例の場合では「天気」という引数を受け取って処理をしています。

基本的に関数は引数を受け取って処理をします。

戻り値とは

戻り値とは関数が処理をした結果返す値となります。

こちらも冒頭の傘の例で説明すると、天気という引数を受けとって処理をした結果、「傘が追加された荷物」が戻り値になります。

関数を実行することによって何を得たいのかという目線が重要ですね。

関数の呼び出し方

関数を呼び出すときは以下のようになります。

関数の呼び出し方
・ 引数が 1 つの場合
関数名(引数)

・ 引数が 2 つの場合
関数名(引数1, 引数2, ...)

・ 戻り値を変数に代入する場合
変数名 = 関数名(引数)

変数については以下の記事を参考にしてみてください!

関数を作ってみよう!

関数の作成(引数なし)

まずは入力(引数)のない関数を作成してみましょう。

作成する関数

自己紹介をする関数(私の名前は田中太郎です。)

関数を作成する際はいきなりヘッダーの部分から書き始めるのではなく、関数化したい処理を先に記述すると作成しやすいです。今回は文字列を表示させたいので処理内容は以下です。

関数のサンプル
# 処理を確認
print('私の名前は田中太郎です。')
--- 以下実行結果 ---
私の名前は田中太郎です。

処理が確認できました。それでは関数化していきましょう。

まずは処理の内容の先頭行を 1 つあけ、その後インデントとして空白スペースを開けます(設定により半角スペース 4 つ分の時もあれば空白スペース 2 つ分の時もあります。)

関数のサンプル
                                  # 先頭行をあける
    print('私の名前は田中太郎です。') # 処理にインデント(半角スペース)を設ける

インデントをつける際は、インデントをつけたいコード上にカーソルを置き、tab キーを押すことでインデントをつけることも可能です。(こちらが非常に便利です。)

それでは上 1 行の部分にヘッダーを記述します。関数名は基本的には何でも構いません。

注意

事前に定義されている関数 (例:sum()) があり、その関数名と同じ名前で関数を定義する (例:sum() 関数を定義する) と上書きしてしまうことになり、元々定義されていた関数が使えなくなってしまいます。
元々定義されているものを予約語と呼びますのでこちらも覚えておいておくとよいでしょう。

ヘッダーを記述したものを以下に記載します。

関数のサンプル
# 関数化
def introduce():
    print('私の名前は田中太郎です。')

関数を作成できました。しかし関数は定義されただけでは実行されません。

定義した関数を使用するためには定義を行うコードとは別に、関数を実行するためのコードを記述する必要があります。

それでは関数を実行してみましょう。

関数のサンプル
# 関数の実行
introduce()

--- 以下実行結果 ---
私の名前は田中太郎です。

このように関数を自作することができました!しかしこの関数では田中太郎さんしか使用できない関数になってしまいます。

そこで名前の欄を適宜入力する値によって変更できるようにすることで、誰でも使用できる関数にしてみましょう。この時に引数を使用します。

関数の作成(引数あり)

それでは関数を書いてみます。

関数のサンプル
# 名前を指定できるように変更
def introduce(name):
    print('私の名前は' + name + 'です。')

上記のように、適宜変更したい部分に変数(今回の場合は name)を置きます。(こちらも名前はなんでも構いません。ただし既出の名前は避けるようにしてください。

そしてヘッダーの () の中に定義した変数をいれることによって、関数を実行する際にその変数に値を渡せます。

それでは実行してみましょう。

関数のサンプル
# 関数の実行
introduce('田中二郎')

--- 以下実行結果 ---
私の名前は田中二郎です。

上記の関数では name という引数に 田中二郎 という文字列が代入され、その後 print() 関数の中で name が使用された状態を表しています。

補足

print() 関数のように事前に Python で定義されている関数を組み込み関数と呼びます。私達が 1 から全てコードを組むことは非常に大変ですが、事前に定義されている関数をうまく使用することで複雑なコードも簡単に記述できます。

何か新しい実装を行う際は、その処理を行える関数が既に用意されていないかを探してみるのもとても大切です。

冒頭の持つ傘を判別する関数の作成

おまけとして冒頭に傘を判別したプログラムをコードで書くならといった部分をご紹介します。

例えば今日でも明日でも、この関数に天気という引数を渡して呼び出すことで簡単に傘を持つのか、日傘を持つのか判別できるといったイメージです。

傘を判別する関数
# 天気を受けとってどの傘を持つかを判別する関数
def whichUmbrella(weather):
  # 荷物
  baggage = ['wallet']

  # もし雨なら荷物に傘を追加
  if weather == 'rain':
    baggage.append('umbrella')
  # もし晴れなら荷物に日傘を追加
  elif weather == 'sunny':
    baggage.append('parasol')
  
  # 戻り値として荷物を返す
  return baggage

関数を実行
# 関数を実行する
baggage = whichUmbrella('sunny')

print(baggage)

実行結果
['bag', 'umbrella']

最後に

いかがでしたでしょうか。今回お伝えした内容をまとめます。

  • 関数を使用することで「複雑な処理を何度も記述する」ことを簡単にできる。
  • 関数を作成する際は一度処理の内容を確認してから、インデントとヘッダーの作成を行う。
  • 引数を使用することで、処理内容の一部を実行時に適宜変更できる。

関数の機能を少しでも身近に感じていただければ幸いです。

また動画で関数の内容を学習したい!という方は、元副社長の動画がおすすめです。


https://www.youtube.com/watch?v=NHvecIS21K8

以上、Python 学習している方々のお力添えになれば幸いです!

こちらの記事もオススメ

まずは無料で学びたい方・最速で学びたい方へ

まずは無料で学びたい方: Python&機械学習入門コースがおすすめ

Python&機械学習入門コース

AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!

無料で学ぶ

最速で学びたい方:キカガクの長期コースがおすすめ

一生学び放題

続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!

AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?

無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!

説明会ではこんなことをお話します!
  • 国も企業も育成に力を入れている先端 IT 人材とは
  • キカガクの研修実績
  • 長期コースでの学び方、できるようになること
  • 料金・給付金について
  • 質疑応答