【プログラミング】[Python-第6回]関数の宣言や呼び出しをするコードの書き方

プログラミング
<strong>komori</strong>
komori

こんにちは。今回もPythonの書き方について紹介していきます。

第6回目となる今回は「関数」をテーマにした内容となっています。プログラミングを勉強していく上で関数を使わなくても動かす事はできますが自作の関数を使えるようになることは、プログラミングスキルが格段に向上します。

前回までで、条件分岐処理及び繰り返し処理を含めて解説しました。

条件分岐処理に関する解説記事はこちら

◆条件分岐処理に関する繰り返し処理の解説記事はこちら


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

Pythonで関数作って呼び出す

Pythonには、print()やinput()などのたくさんの関数が存在していますが、特定の処理を関数として作ることができ、呼び出すことができます。

<strong>Deviko</strong>
Deviko

関数を作るってどういうことなの???

<strong>komori</strong>
komori

同じ処理を繰り返したり、特定の処理をするコードを部品化(関数として定義)して、必要な時に呼び出せる様にする事です。

Pythonで関数を定義する(作る)と実行する(呼び出す)方法

関数の基本の書き方は以下の2つで構成されています。

Pythonで関数を使う方法
  • 関数の定義(作る)
    • 関数名と処理動作の書いて定義する
  • 関数の実行(呼び出す)
    • 定義した処理動作を呼び出す

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

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

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

関数を実行する(呼び出す)

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

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

#関数の呼び出し
kannsuuname()
サンプルコードの実行結果
hello
<strong>Deviko</strong>
Deviko

これってPrint(‘hello’)じゃダメなの?

<strong>komori</strong>
komori

もちろん同じ結果になります。
サンプルの様に単純な処理であれば、関数を使うメリットは見えづらいですが、膨大で複雑な処理を毎回書くことを想定すると関数を使える・使えないで時間や労力はかなり違ってきます。

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

Pythonに限らず、プログラミングでは「引数(ひきすう)」や「戻り値(もどりち)」といった言葉がよく使われます。
引数や戻り値を一言で表すとすれば下記になります。

引数呼び出し元から関数へデータ渡す仕組み
戻り値関数から呼び出し元へデータを渡す仕組み
呼び出し元と関数における引数と戻り値のイメージ

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

サンプルコード
呼び出し元から「サトシ」と「タケシ」という文字列を引数として受け取った関数のうごき
#関数の定義と関数で処理する内容
def hello(name):
    print(f'こんにちは、僕は{name}です。')

#関数helloを呼び出し(引数としてサトシとタケシをそれぞれ変数nameに代入する)
hello('サトシ')
hello('タケシ')
サンプルコードの実行結果
こんにちは、僕はサトシです。
こんにちは、僕はタケシです。

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

複数の引数を使って関数のコードを書く方法

複数の引数を用いた関数定義の書き方(※処理行はインデントしてコードを書きます。)

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

複数の引数を用いた関数定義の書き方(※引数に代入する順番には注意が必要です。)

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

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

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

引数(格納される変数名)profile
(‘サトシ’,’10’,’ポケモンバトル’)
profile
(‘タケシ’,’15’,’ポケモン育成’)
nameサトシタケシ
age1015
hobbyポケモンバトルポケモン育成
※呼び出す際に引数を記入する順番で代入していくことになります。
サンプルコードの実行結果
こんにちは、僕はサトシです。年齢は10歳で、趣味はポケモンバトルです。
こんにちは、僕はタケシです。年齢は15歳で、趣味はポケモン育成です。

コレクションを引数として用いて関数のコードを書く方法

コレクションを引数として指定することも可能です。

サンプルコード
#関数の定義と関数で処理する内容
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歳です。

実行結果からコレクション“ages”がリストとして認識されたことが分かります。
また、関数の呼び出し時の引数はサトシの年齢の10とタケシの年齢15であることから、平均年齢である12.5が関数の処理により求められました。

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

戻り値を用いて関数のコードを書く方法

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

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}歳です。')

関数tashizannが10と15の値を引数として呼び出されます。
次に関数の処理で10+15が処理され、結果の25が変数ansに代入される流れになります。
最後にreturn ans で呼び出し元の変数ansに25が代入され、print関数で出力されます。

サンプルコードの実行結果
サトシとタケシの年齢の合計は25歳です。

呼び出し元の変数(サンプルで言えばans)と関数で戻り値に指定した変数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)が求められて結果が出力される

関数呼び出し時に引数、関数で戻り値を指定した場合の処理の流れ

重要ポイント
処理の順番について
  • ①関数を呼び出す

  • ②関数が引数を用いて実行される

  • ③戻り値が返される

  • ④変数ansが戻り値に置き換わる(化ける)

  • ⑤print関数の処理が実行される

いくつもの関数を連携させたコードを書く

サンプルコード(3つの関数 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)
<strong>komori</strong>
komori

かなり複雑に見えますが、各関数で処理している内容はとてもシンプルです。
以下のとおり処理が流れるようになっています。

サンプルコードの実行結果
ピカチューさんの身長・体重を入力してください
身長を入力してください(m)>> 0.4
体重を入力してください(kg)>> 6
ヒトカゲさんの身長・体重を入力してください
身長を入力してください(m)>> 0.6
体重を入力してください(kg)>> 8.5
ピカチューさんのBMIは37.5です。
ヒトカゲさんのBMIは23.6です。
それぞれの関数と処理している内容について
  • input_spec関数:
    →引数(ピカチュー、ヒトカゲ)を名前とし、身長と体重をリストに登録している処理

  • bmi_calc関数
    1の関数の戻り値を引数としてBMIを計算する処理

  • output関数
    →2の関数の戻り値を引数としてBMIを表示する処理

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

今回はPythonに元々存在する関数ではなく、処理をまとめて関数を作るコードを紹介しました。

引数や戻り値を使って個別な結果になるので、汎用処理として関数を使うことができます。個人や少人数で使うようなプログラムでは、関数を使わなくても「条件分岐」や「繰り返し」でプログラムを書くことは十分可能です。

しかし、より複雑で実践的なコードを書く上で、同じ処理を繰り返し書くような事はせず、事前に関数として部品を作っておき、必要なタイミングで呼び出すことができれば同じ結果になるプログラムであっても効率的に書くことができると言えます。

エンジニアレベルの人なら使えて当然なものでも、非エンジニアや日常的にプログラムに触れる機会の少ない人からすれば難易度が高い部分と感じる内容かもしれませんが、スキルアップを狙う上では使えるようにしておきましょう。

以上、今回は関数の基礎部分を紹介しました。

次回は関数の応用テクニックについて紹介します。

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村
PVアクセスランキング にほんブログ村コダマのもりブログ - にほんブログ村

コメント

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