戻り値?return?よくわからん。という人向けの解説【プログラミング初心者向け】
前回の記事では、「プログラミング未経験から独学でどれくらい勉強してプログラマーに転職できたか」という実体験を紹介していきました。
今回は、プログラミングの基本となる概念の一つ「戻り値」について、出来るだけわかりやすく解説していきます。解説に使用する言語はPythonですが、理解すべき考え方としては他のプログラミング言語とも変わらないはずです。
・なぜ戻り値について解説するか
僕が最初意味分からなかったからです。あと、Twitterでプログラミング初心者の方が「戻り値ってなんやねん・・・」と言われているのを結構見るので、「やっぱりわからないよね!」ってことでターゲットにしました。
・Pythonの基礎知識
1変数の宣言はありません。
2コンソールに出力する際はprint()関数を使います。
3関数を定義する時には
def 関数名(引数):
処理
という風に記述します。
4定義した関数を呼び出す時は
関数名(引数)
5戻り値を返す時はreturnを使います。
・関数について
簡単に言うと、「引数」という材料を渡すことで、決めておいた処理をやってくれるものです。プログラミング言語ごとにもともと設定されているものもありますが、自分でも作れます。
def 関数名(引数):
処理
という風に記述します。
関数を一度作っておくと、同じ処理が必要になるたびに毎回処理を書かなくても良くなるので便利です。
・引数について
関数に渡す材料です。引数と言われると新しい言葉、概念のように感じる人もいると思いますが、実はみなさん普通に知っているはずです。
EXCELで言えばSUM関数やAVERAGE関数は使ったことがある人は多いのではないでしょうか。=SUM(A1:A10)のように書くと「A1からA10の値の合計」がセルに表示されますよね。()内のA1:A10が、まさに「引数」です。
=AVERAGE(1,5)と書くと、「1と5の平均」がセルに表示されます。この場合は1と5が引数です。
さて、事前知識の説明はここまでで、ここからは例を出しつつ戻り値の説明をしていきます。
実行結果も載せていますが、実際にエディタに自分で打ち込んだり、数値を変えたり、関数の内容を変えて試すと、より理解が深まると思います。
・サンプルコード1
sample1.py
def plus_one(a):
b = a + 1
return b
c = plus_one(5)
print(c)
実行結果
6
解説
最初の3行でplus_one()という関数を定義しています。aという引数を渡すことで、その値に1を足したものをbに代入し、そのbを戻り値として返す、という関数ですね。(非常に画期的で、素晴らしい関数ですよね!ね!!)
定義したplus_one()関数も、定義しただけでは意味がありません。5行目で、plus_one(5)とすることで引数として5を渡し、その結果をcに代入しています。
定義した関数でaになっている部分が5になるので、b=5+1となり、戻り値は6となります。その6がcに代入され、最後のprint()でコンソールに
6
と出力されます。
・サンプルコード2
sample2.py
def plus_one(a):
b = a + 1
c = plus_one(5)
print(c)
実行結果
None
解説
先程のサンプルコード1と違い、3行目にreturnがありません。つまりこのplus_one()関数は、「足し算するけど、結果は何も返さないよ」という関数になっています。
(「宿題やったけど家に忘れてきました」って言ってる学生と同じです。先生としてはちょっと対応に困るやつです。)
plus_one(5)として引数を渡したものの、結果は何も返ってこないので、cには6ではなくNoneが入り、実行結果がNoneになります。
・サンプルコード3
sample3.py
def plus_one(a):
return a
b = a + 1
return b
c = plus_one(5)
print(c)
実行結果
5
解説
サンプルコード1と違い、2行目にもreturnがあります。あまりこれをミスでやる人はいないと思いますが、挙動を一応説明しておくと、関数内の最初の「return a」の時点で処理が終わるので、「return b」は実行されず、結果として引数で渡した5がそのまま返ってくることになります。
ミスでこれをやる人はいないと思いますが、関数を定義する時や、人が作ったプログラムの動作確認をする時、あえて途中でreturnを入れて、何が返ってくるか確認することはわりとあります。バグ発見や動作確認のためにreturnを使って変数の内容を逐一確認する手法はプログラミング初心者の方はぜひ覚えておくと良いと思います。
・サンプルコード4
sample4.py
def plus_one(a):
b = a + 1
print(b)
c = plus_one(5)
print(c)
実行結果
6
None
解説
サンプルコード1と違い、3行目がreturnではなくprint()関数になっていますね。この関数は、引数に1を足し、その結果を画面に出力し、戻り値としては返さない、ということです。
戻り値が無いので、cにはサンプルコード2同様Noneが入るので、関数の処理結果である6が画面に表示された後、cの中身であるNoneが表示される、という流れです。
・print()とreturnの違い
個人的にはこの2つの違いが長らく分かっていませんでした。おそらくProgateで基本的なコードしか書かなかったからだと思いますが、
この違い(使い分け)を示すために、あと2つサンプルコードをお見せします。
・サンプルコード5
sample5.py
def plus_one(a):
b = a + 1
return b
c = plus_one(5) + 2
print(c)
実行結果
8
・サンプルコード6
sample6.py
def plus_one(a):
b = a + 1
print(b)
c = plus_one(5) + 2
print(c)
実行結果
6
例外が発生しました: TypeError
unsupported operand type(s) for +: 'NoneType' and 'int'
解説
サンプルコード5では、サンプルコード1と全く同じ関数で、cはその関数の戻り値にさらに2を足し、画面に表示します。
サンプルコード6では、サンプルコード4と全く同じ関数で、cはその関数の戻り値にさらに2を足し、画面に表示するものですが、結果としてエラーになりました。
サンプルコード5は関数の戻り値がちゃんと数値の6として返ってくるため、その後2を足す、という風にその後の処理で使用することが出来ましたが、
サンプルコード6では関数の戻り値がNoneのため、関数内で計算した結果得られた6を、その後の処理で使うことが出来ません。戻り値はNoneなので、「Noneと数値を足し算する処理は出来ません」と怒られたわけです。
その関数内で得られた何らかの値を、その後の処理で使用する場合は戻り値として返してもらう必要がある、ということですね。
関数と戻り値のイメージ
個人的には、returnで戻り値を返している場合、関数全体を「一つの変数」としてイメージすると、簡単に感じるのではないかと思います。
c = plus_one(5) + 2
であれば、plus_one(5)が6という数値を設定された変数、と考えるわけです。
c -= 6 + 2
となるので、答えは8ですね。
終わりに
関数や引数、戻り値と、プログラミングの基本でありながら、躓きがちな内容について、僕なりにわかりやすく解説してみたつもりですが、いかがでしたでしょうか。
Pythonを使った書き方ではありますが、戻り値そのものの考え方や、「なぜ戻り値として返す必要があるのか」などは他の言語を学習されている方にも伝わったのではないかと思います。
ただ、理解しても自分で試してみないと定着しないので、この記事を読んだ方でまだ自分で試していない方は、ぜひこの後すぐに実際に関数を定義し、戻り値や関数の定義の仕方・使い方について確認してみてください。
最後まで読んでいただきありがとうございました。
今後もプログラミング学習やプログラマーとしての仕事、副業に関することなどを中心に記事を書いていきますので、良ければ読んでいただけると嬉しいです。
Twitterもやっていますので、気軽にフォロー・リプライください。質問などもしっかりお答えします。