ホーム»プログラミング» 【プログラミング】[独学][Python-第6回]関数を用いて効率的なコードを書く方法(基礎編)
a

【プログラミング】[独学][Python-第6回]関数を用いて効率的なコードを書く方法(基礎編)

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

こんにちは。
今回もPythonの書き方について紹介していきます。
第6回目となる今回は「関数」をテーマにした内容となっています。
プログラミングを勉強していく上で書けなくても動かす事ができますが、自作関数を覚えることで各段にプログラミングスキルが向上します。

前回までで、条件分岐処理及び繰り返し処理を含めて解説しました。
簡単なプログラムのコードを書く上では、これらを組み合わせて書いていくことである程度の事は処理できるようになってくる頃かと思います。



第6回となる今回は「関数」について触れていきたいと思いますが、今までの中でも紹介していた「print」や「input」などの関数とは異なり、自ら関数を作って呼び出すことも可能です。

<strong>Deviko</strong>
Deviko

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

<strong>komori</strong>
komori

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


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

オリジナルの関数を定義して呼び出す

シンプルな関数の定義

入力コード

def kannsuuname():
#関数の定義と関数で処理する内容
def kannsuuname():
    print('hello')

#関数の呼び出し
kannsuuname()
関数定義の書き方~
def 関数名():
    処理
処理に行はインデントしてコードを書きます。

実行結果

hello
<strong>Deviko</strong>
Deviko

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

<strong>komori</strong>
komori

もちろん同じ結果になります。
でも、複雑な処理が増えれば増える程にコードを書く量も多くなるので、その都度同じ処理をするコードを書くのではなく、部品化した自作関数を呼び出す様に作っていくことは効果が大きいと言えます。

関数を使う上では下記の2ステップのコードを書く必要があります。

1.関数の定義:関数名と処理の部分の動作を記述して定義する

2.関数の呼び出し:定義した動作を呼び出す際に関数名を記述する

※既に存在する関数名を定義するとエラーにならずに上書きされて点に注意が必要です。

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

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

●引数:呼び出し元から関数へデータを渡す仕組み

●戻り値:関数から呼び出し元へデータを渡す仕組み

引数を用いてコードを書く方法

入力コード

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

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

関数helloの引数(ひきすう)として変数nameを使った例です。
関数helloの呼び出し時に変数nameに’サトシ’と’タケシ’を代入して関数を実行します。

実行結果

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

関数呼び出し時に引数として「サトシ」を用いた場合の結果と、「タケシ」を用いた場合の結果が異なっている事が分かります。

複数の引数を用いてコードを書く方法

入力コード

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

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

複数の引数を用いて、変数name,変数age,変数hobbyに代入して関数profileの処理を実行するコードの書き方となります。

引数(格納される変数名)profile
(‘サトシ’,’10’,’ポケモンバトル’)
profile
(‘タケシ’,’15’,’ポケモン育成’)
nameサトシタケシ
age1015
hobbyポケモンバトルポケモン育成
※呼び出す際に引数を記入する順番で代入していくことになります。

実行結果

こんにちは、僕はサトシです。年齢は10歳で、趣味はポケモンバトルです。
こんにちは、僕はタケシです。年齢は15歳で、趣味はポケモン育成です。
複数の引数を用いた関数定義の書き方~
def 関数名(引数1,引数2,引数3...):
    処理
処理行はインデントしてコードを書きます。

複数の引数を用いた関数呼び出しの書き方~
関数名(引数1,引数2,引数3...)
引数に代入する順番には注意が必要です。

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

入力コード

#関数の定義と関数で処理する内容
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を呼び出して平均年齢を計算し結果を変数avgに代入して結果を表示するプログラムとなります。
※コレクションagesがリストであると認識されているかを確認するため、type関数で表示するコードを書いています。

実行結果

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

コレクションagesがリストとして認識されている事が分かりますね。また、関数の呼び出し結果として平均年齢が表示されています。

コレクションについては下記にて解説しています。

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

1.戻り値の変数と受け取る変数の名前を揃えた場合の書き方

入力コード

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

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

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

受け取る変数ansと戻り値ansと変数名が同一の場合。
(厳密に言えば別の変数として扱われているため、同じ名前であっても異なるものとして扱われている。)

実行結果

サトシとタケシの年齢の合計は25歳です。
引数と戻り値を利用した関数定義の書き方~
def 関数名(引数1,引数2,引数3...):
    処理
    return 戻り値
処理及び戻り値行はインデントしてコードを書きます。

関数呼び出しの書き方~
関数名(引数1,引数2,引数3...)
引数に代入する順番には注意が必要です。

処理の流れについて
①関数を呼び出す
②関数を実行される
③戻り値が返される
④変数ansが戻り値に置き換わる(化ける)
⑤print関数の処理が実行される

2.戻り値の変数と受け取る変数の名前を揃えない場合の書き方

入力コード

#関数の定義(タケシとサトシの年齢差の結果を戻り値として返すコード)
def hikizann(x2,y2):
    answer = x2 - y2#15-10が実行されている

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

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

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

実行結果

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

関数を連携させてコードを書く方法

入力コード

#身長と体重を入力すると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

かなり複雑に見えますが、各関数で処理している内容はとてもシンプルです。

・input_spec関数では、身長と体重をリストに登録している処理を実施

・bmi_calc関数では、身長と体重を受け取ってBMIを計算する処理を実施

・output関数では、bmiを受け取って表示する処理を実施

といった流れとなっています。

実行結果

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

自作関数を用いて更に効率的なコードを書く方法まとめ

今回はPythonに元々存在する関数とは別に、自ら関数を作ることで各処理を部品化するための書き方の基本をシンプルに紹介しました。

個人や少人数で使うようなプログラムでは、関数を用いなくても「条件分岐」や「繰り返し」で無骨ながらでもプログラムを書くことは十分可能です。

しかし、より複雑で実践的なコードを書く上で、効率化は必須となりますので関数は必ず抑えておきたいものとなります。

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

今回はそんな関数の基礎部分のみを紹介しました。
次回は関数の応用テクニックについて紹介します。

コメント

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