はじめに
コジマです。
とあるフォロワーさんのツイートで
「『引数』と『戻り値』について分かりやすく説明できる人はすごい!」
っていうツイートを見て自分でやってみることにしました。
今まで自分の備忘録兼ねてやってるところあったので
講師気分は初めてです。頑張ります。
すごく細かく話すことはしないです。
感覚的に分かりやすくと目的としてやっていきます。
まず、「関数」について
関数知らないとこの後の話できないので前置きすることにします。
関数とは…
関数とはざっくり
「処理をひとまとめにしたもの。そして処理に意味を持たせたもの」を言います。
後半太字なのは結構大事だからです。
例として円の面積を計算するプログラムを作ってみます。
言語はPythonを使ってみます。別に言語に関わらない話なので自分んが学んでいる言語に置き換えてみてください。
まずは関数なしバージョン
#関数について解説する簡単なサンプル import math #円周率 PI = math.pi #半径はなんでもいいけど、今回は3とする radius = 3 #円の面積を求める #円の面積=半径*半径*円周率 area = radius * radius * PI print用に文字列変換 area = str(area) print("円の面積は["+area+"]です")
気づいてほしいこと
これでもまあいいんですが、気づいてほしいのは
上記のサンプルは円の面積を求めるプログラムとしては説得力が弱いです。
なぜなら変数areaに入っている値は
[円の面積]を求めた値より[半径×半径×円周率]を計算した値
の意味が強いからです。
ここで「は?」って思わないでほしいです。
「は?」って思った人は円の面積を求める=半径×半径×円周率が至極真っ当当たり前だと疑わないからです。
処理に明示的に意味を持たせることで
可読性の高いコードを書くことができます。
そこで、こうする
ここでやりたいのは2つ
(1)以下の作業をひとまとめにしたい
- 円周率を定義する
- 円の面積を計算する
- print用に文字列に変換する
(2)計算に意味を持たせたい
area = 円の面積
のように直感的に意味がわかる形にしたいのです。
以上を考慮すると以下のようにプログラムが変わります。
関数使うバージョン
#関数について解説する簡単なサンプル import math #円の面積を計算する関数 #引数(半径) #戻り値(円の面積:文字列) def calculate_circle_area(_radius): #円周率 PI = math.pi #円の面積を求める #円の面積=半径*半径*円周率 _area = radius * radius * PI #文字列型にキャスト _area = str(_area) return _area ############## #main処理 ############## #半径 radius = 3 #円の面積 area = calculate_circle_area(radius) print("円の面積は["+area+"]です")
何が変わったかというと
main処理以降を見るだけで全体のやりたいことがわかる。
ということです。
要するに
プログラムを全部見なくてもいい。
ということです。
最初のサンプルは
- 円周率を定義
- 半径を定義
- 半径*半径*円周率を計算
- print用に文字列変換
- printで計算結果を表示
書き換えた方は
- 半径を定義
- 円の面積を計算
- printで円の面積の計算結果を表示
このように
プログラムを読む手順が減り、円の面積を求めるという意味合いが強くなりました。
これが関数の意味であり、使い方です。
ちなみに、関数名を定義するときは英語の動詞から始める。
そして、コメントには関数の概要、引数、戻り値について記載があると親切です。
実務ではルール化されているところもあります。
今回重要なところではないですが、頭の片隅に入れておきましょう。
「引数」について
前置きが長くなりましたが、引数と戻り値の話をしていきたいと思います。
と言ってもそんなに多く話すことはありません。
今回のサンプルでいうところの
area = calculate_circle_area(radius)
の[radius]や
def calculate_circle_area(_radius):
の[_radius]にあたる
変数を「引数」といいます。
area = calculate_circle_area(radius)
の[radius]にあたる引数を「実引数」
def calculate_circle_area(_radius):
の[_radius]にあたる引数を「仮引数」と
呼び分けたりしますが、あまり使うことはありません。
その名の通り「引っ張ってくる変数」で「引数」と思っておけば間違いないかと思います。
引数を使用することで
関数の外で定義した変数を関数の中で使用することができます。
この場合、関数の外で半径を定義して、それを引数として使用することで
関数内で半径を使用した計算が可能になっているのです。
「戻り値」について
今回のサンプルで言うところの
return _area
の[_area]あたる変数を「戻り値」と言います。
処理結果を戻してあげることができます。
area = calculate_circle_area(radius)
の[area]に先ほどの[_area]の値が代入されます。
「返り値」と呼ぶこともあります。返り血ではありません。
その名の通り「戻してあげる値」で「戻り値」と思っておけば間違いないかと思います。
CやJavaなど、言語によっては
int function(int hoge){
int fuga
return fuga + hoge
}
のように引数や戻り値に型の宣言が必要な場合があります。
関数に意味をつけ、戻り値を使用することで戻り値が何の値か分かりやすくなります。
そして、プログラムを読むときに処理結果だけを意識すれば良くなります。
まとめる
関数から始まり、引数と戻り値の解説をしてみました。
それぞれどんなもので、また、何の役に立つのかを意識して書いたつもりです。
今回のサンプルを基に関数を呼び出してから処理結果を返すまでを図で表現してみました。
引数とか戻り値とかよくわからないよ!
って初学者のお力になれたなら嬉しいです。
この記事が面白いと思ってくれたら是非Twitter(@kojimanotech)のフォローもお願いします!
以上。コジマでした。