pythonの関数(def)の文法と引数や戻り値を使う方法

本記事はpythonで「関数」を使ったプログラミングの方法を紹介しています。

関数を使っていくことで特定の処理を部品化して、必要に応じて呼び出すことができるようになり、効率的なプログラミングができるようになります。

また、関数を用いることでコードの可読性も向上し、アップデートやメンテナンスも実施しやすくなりますので、チーム開発などの実務上ではより効果を発揮する内容となります。

pythonプログラミングの「関数」とは

そもそも関数とは、どういったものかイメージしにくいところもありますがシンプルに言えば…

特定の処理をまとめたプログラムのかたまり

と言えます。

たとえば、消費税を計算するプログラムを関数にして、入力情報として料金が入力される度に関数を呼び出すことができるようになり、同じ処理をするコードを何度も書かなくてもよくなるメリットがあります。

関数のイメージと書き方について、サンプルコードをつかって以下で詳しく説明していきます。


今回も下記の本に掲載されている内容から学んでいきましょう。

pythonで関数作って呼び出す

そもそもpythonには、既に多くの関数が存在しています。
一部ですがよく使われる関数を以下の表に掲載します。
恐らく、pythonでプログラミングをされたことのある人は、一度は目にしたことがあるものだと思います。

関数 機能の説明
print() 出力・表示
type() 型を返す
input() 入力より取得
sum() 合計値を返す
len() 要素の数を取得
round() 四捨五入
pythonの関数をよく使うものだけ抜粋

ここからは、上記で掲載したpythonに既にある関数とは別に、自ら関数を作って呼び出す方法について紹介します。

pythonで関数を利用するための工程は、大きく分けて2つあります。

関数の定義

 関数を作る工程となります。ここで具体的な関数名を宣言したり、処理を書き込みます。

関数の実行

 関数を呼び出し、1で書いた処理を実行します。

順番にみていきます。

pythonで関数を作る(defをつかって宣言する)

関数を定義する(作る)にはdefを使う

def 関数名():
処理

コード冒頭にdefを書き、任意の関数名の後ろに()をコロンをつける。
def という単語は、英語の define (定義) の略です。

関数名は予約語や、既に存在する関数名を定義するとエラーにならずに上書きされる点に注意が必要です。
処理を書く行は、インデントして書き始めるところがポイントです。
サンプルコード
def kannsuuname():
    print('hello')

def kannsuuname():
「def」の後に関数名の「kannsuuname」を書き関数の宣言をします。

print(‘hello’)
インデント後に処理の部分を書きます。
(ここでは、シンプルにハローと表示する処理)

pythonで作った関数を呼び出す(実行する)

関数の実行(呼び出し)は「関数名()」と書く

宣言している関数名のうしろに()をつけます。

関数名()

サンプルコード(関数を定義したコードに追記)
#関数の定義と関数で処理する内容
def kannsuuname():
    print('hello')

#関数の呼び出し
kannsuuname()

実行結果

hello

「引数」と「戻り値」を利用して関数を実行する

pythonに限らず、プログラミングでは「引数(ひきすう)」や「戻り値(もどりち)」といった言葉がよく使われます。
関数は、引数や戻り値を使う事で、特定の値を利用して処理をすることもできます。

用語 用語の説明
引数(ひきすう) 呼び出し元から関数へデータ渡す仕組み
戻り値(もどりち)
返り値(かえりち)
関数から呼び出し元へデータを渡す仕組み
pythonの関数をよく使うものだけ抜粋
呼び出し元と関数における引数と戻り値のイメージ

素材をわたして加工してもらったものを受けとるといったイメージだよ。

引数ありで関数のコードを書く

サンプルコード

呼び出し時に「サトシ」と「タケシ」という文字列の値を引数として受け取り、関数を実行する

#関数の定義と関数で処理する内容
def hello(name):
    print(f'こんにちは、僕は{name}です。')

#関数helloを呼び出し(引数としてサトシとタケシをそれぞれ変数nameに代入する)
hello('サトシ')
hello('タケシ')

関数名”hello“を呼び出しする時に、引数として「サトシ」を関数に渡します。
次に「タケシ」を引数として関数に渡して処理を実行しています。

実行結果

こんにちは、僕はサトシです。
こんにちは、僕はタケシです。

引数に指定した文字列(サトシ・タケシ)が表示されて実行結果が返ります。

複数の引数を使った関数のコードを書く

def 関数名(引数1,引数2,引数3…):
処理

defキーワードのあとに関数名を記入する。()内には引数をコンマ区切りで書くことができます。

複数の引数を用いた関数を呼び出す(※引数に代入する順番には注意が必要です。)

関数名(引数1,引数2,引数3…)

サンプルコード
#関数の定義と関数で処理する内容
def profile(name,age,hobby):#複数の引数を利用するコード
    print(f'こんにちは、僕は{name}です。年齢は{age}歳で、趣味は{hobby}です。')

#関数profileを呼び出し、複数の引数を利用するコード
profile('サトシ','10','ポケモンバトル')
profile('タケシ','15','ポケモン育成')

複数の引数を使って関数を呼び出すコードです。呼び出し元で指定した、サトシの名前、年齢、趣味が関数のnameagehobbyに代入されて、profile関数の処理が実行されます。

引数(変数名) 関数を呼び出す時の引数(値) 関数を呼び出す時の引数(値)
name サトシ タケシ
age 10 15
hobby ポケモンバトル ポケモン育成

実行結果

こんにちは、僕はサトシです。年齢は10歳で、趣味はポケモンバトルです。
こんにちは、僕はタケシです。年齢は15歳で、趣味はポケモン育成です。

引数に「サトシ」・「10」・「ポケモンバトル」を指定した場合の実行結果と、「タケシ」・「15」・「ポケモン育成」を指定した場合の結果が返ってきます。

引数は関数呼び出しの時に指定した順番で代入されます。
そのため、呼び出しの時に、profile(’10’,’ポケモン’,’サトシ’)と引数を指定した場合は以下のように返ります。

こんにちは、僕は10です。年齢はポケモン歳で、趣味はサトシです。

コレクションを引数にする関数のコードを書く

変数だけでなく、リストを引数として指定することも可能です。

サンプルコード
#関数の定義と関数で処理する内容
def calc_avg(ages):#コレクションを引数として利用するコード
    avg = sum(ages) / len(ages)
    print(f'サトシとタケシの平均年齢は{avg}歳です。')

#関数の呼び出し、コレクションを引数として利用するコード
ages = [10,15]#コレクションのリストに値を代入する
print(type(ages))#リストデータであるかを確認するコード
calc_avg(ages)#リストを引数として関数calc_avgを呼び出すコード

コレクションのリスト“ages”に1015の値を代入し引数として指定しています。

この関数では、引数で渡された値を使って、平均年齢を計算し、表示する処理をします。

関数「calc_avg」の呼び出しで、引数にリストの「ages」を指定しています。
※print(type(ages))は、正しくリスト型であると認識されているかを確認のためコードを書いています。

実行結果

<class ‘list’>
サトシとタケシの平均年齢は12.5歳です。

print(type(ages))の実行結果から、<class ‘list’>が表示されています。
これにより「ages」がリストとして認識されていることが分かります。また、関数の呼び出し時の引数がサトシの年齢「10」と、タケシの年齢「15」となりますので平均年齢である12.5が関数の処理により求められました。

ages = [10,15]により、リストの中に「10」と「15」の要素があるリストが生成されます。この「ages」を渡して関数の呼び出しをしているのが、calc_avg(ages)となります。

関数内の処理、avg = sum(ages) / len(ages) でリスト内の要素である「10」、「15」を合計するsumと要素数を返すlenを使って平均を算出し、結果を変数のavgに代入します。

最後にPrint関数をつかって文章と組み合わせて結果を出力します。

コレクションについては、以下の記事で詳しく解説しています。

戻り値を使った関数のコードを書く

引数と戻り値を指定した関数の定義方法
(※処理及び戻り値の行はインデントしてコードを書きます。)

def 関数名(引数1,引数2,引数3…):
処理
return 戻り値

関数の処理によって得た戻り値を変数に代入する
(※引数に代入する順番には注意が必要です。)

変数 = 関数名(引数1,引数2,引数3…)

サンプルコード
#関数の定義(足し算の結果を戻り値として返すコード)
def tashizann(x,y):
    ans = x + y
    return ans #変数ansの値を戻す

#関数の呼び出しをするコード(引数と戻り値を利用する呼び出しの書き方)
ans = tashizann(10,15)#変数ansに戻り値が代入される

print(f'サトシとタケシの年齢の合計は{ans}歳です。')

ans = tashizann(10,15) で関数を実行(呼び出し)するときに、引数として「10」と「15」を指定して関数に渡します。

関数「tashizann」は引数を受け取り、処理に記載された足し算「10」+「15」を実行します。
また、結果として算出された値「25」を変数の「ans」に代入します。

return ans では、関数を実行(呼び出し)するときの変数「ans」に25が代入されます。

最後にprint関数で変数「ans」を出力しています。

実行結果

サトシとタケシの年齢の合計は25歳です。

関数の実行(呼び出し)の変数と、関数の処理後の戻り値に指定した変数ですが、厳密言えば異なる変数として扱われています。そのため、同じ変数名とする必要はありません。

サンプルコードではわかりやすく、どちらも「ans」という変数名にしています。

関数の実行(呼び出し)の変数名と戻り値に代入する変数名が異なる場合

サンプルコード(呼び出し時の変数と戻り値(return)を代入する変数が異なるものを指定)
#関数の定義(タケシとサトシの年齢差の結果を戻り値として返すコード)
def hikizann(x2,y2):
    answer = x2 - y2 #15-10が実行されている

    return answer #変数answerを戻り値にしている

#関数の呼び出しをするコード(引数と戻り値を利用する呼び出しの書き方)
ans2 = hikizann(15,10) #受け取る変数 ans2 に戻り値 answer(5) が代入される(化ける)

print(f'タケシとサトシの年齢の差は{ans2}歳です。')

実行結果

タケシとサトシの年齢の差は5歳です。

戻り値の変数はanswerを指定しているが、正常に年齢差(15-10)が求められて結果が出力されます。

サンプルコードの処理のながれ
  • 引数をつけて関数を呼び出す
  • 関数は1で渡された引数で処理を実行する
  • 関数は戻り値(return)で処理の結果を変数に代入する
  • 3の変数が呼び出しもとの変数に代入(化ける)される
  • Print関数で出力される

複数の関数をつかって処理を部品化し連携させる

サンプルコード
(関数「input_spec」、「bmi_calc」、「output」を作って連携させる
)

#身長と体重を入力するとBMIを計算するプログラム

#引数nameを受け取り、戻り値をspecを返す関数
def input_spec(name):
    print(f'{name}さんの身長・体重を入力してください')
    height = float(input('身長を入力してください(m)>>'))
    weight = float(input('体重を入力してください(kg)>>'))
    spec = [height,weight]
    return spec

#リストspecの身長と体重からBMIを計算して戻り値bmiを返す関数
def bmi_calc(spec):
    bmi =spec[1] / spec[0] / spec[0]
    return bmi

#引数nameとbmiを受け取り、結果を出力する関数
def output(name,bmi):
    print(f'{name}さんのBMIは{round(bmi,1)}です。')#round関数を使って小数第1位まで四捨五入する


#引数ピカチューとヒトカゲを用いて関数input_specを呼び出すコード
Pikachu_spec = input_spec('ピカチュー')
hitokage_spec = input_spec('ヒトカゲ')

#引数ピカチューとヒトカゲの身長・体重を用いて関数bmi_calcを呼び出すコード
Pikachu_bmi = bmi_calc(Pikachu_spec)
hitokage_bmi = bmi_calc(hitokage_spec)

#引数ピカチューとヒトカゲとそれぞれの戻り値bmiを用いて関数outputを呼び出すコード
output('ピカチュー',Pikachu_bmi)
output('ヒトカゲ',hitokage_bmi)

実行結果

ピカチューさんの身長・体重を入力してください
身長を入力してください(m)>> 0.4
体重を入力してください(kg)>> 6
ヒトカゲさんの身長・体重を入力してください
身長を入力してください(m)>> 0.6
体重を入力してください(kg)>> 8.5
ピカチューさんのBMIは37.5です。
ヒトカゲさんのBMIは23.6です。

サンプルコードの解説

input_spec関数の処理内容について

「ピカチュー」や「ヒトカゲ」などの名前を引数として身長と体重を入力を促し、入力値をそれぞれの変数に代入、さらにそれらをリストにして戻り値として返す。

bmi_calc関数の処理内容について

input_spec関数の戻り値を引数としてBMIを計算し、算出された値を戻り値として返す。

output関数の処理内容について

input_spec関数 と bmi_calc関数 の関数の処理で得た戻り値を引数として実行(結果をメッセージとして出力)する。

「関数の宣言や呼び出しをするコードの書き方」まとめ

関数とは特定の処理をまとめたプログラムのかたまり

関数をつかうためには、「関数を宣言」と「関数の実行(呼び出し)」を書く

関数の宣言には def 関数名: を書く

関数の実行(呼び出し)は 関数名() を書く

関数の実行(呼び出し)に引数を指定して処理に利用することができる

関数の処理後に戻り値を指定し、呼び出しもとに返すことができる

今回はpythonに元々存在する関数ではなく、特定の処理をまとめたものを関数として作成し、呼び出す方法を紹介しました。

大きなプログラムの部品として関数を宣言しておけば、同じ処理が必要な箇所で使いまわすことが可能になります。また、引数や戻り値を使って個別の結果が得られるため、必要に応じて呼び出すことで効率的なプログラムが書けるようになります。

以上、今回は関数の宣言・実行(呼び出し)の書き方について紹介しました。

<strong>komori</strong>
komori

コダマのもりブログは、にほんブログ村に登録しています。
この記事がお役に立てましたら、是非フォローお願いします。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました