IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第12回 defで関数を作る方法とreturnの関係 (菱沼佑香) 2020年10月

吉政創成 アシスタントの菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。

さて、ここ数回ほど「Chapter4 プログラムを構成する基本的な機能」で上げられた、Pythonのプログラムを構成する6大要素とされているものを順番に学んできて、前回はif文を使った条件分岐について学習しました。今回は5つ目の「関数」の項目を学んでいきます。

<6大要素のメモ>
①計算機能
②変数(へんすう)
③繰り返し
④条件分岐
⑤関数      ←ココ。
⑥モジュール(外部機能)

関数は自作できる!?

さて、「関数」と言えばこれまでも何度か使ってきていますので、ここで改めて関数とは何かということを振り返るのかなと思いきや...

-----引用-----
関数は、Pythonで用意されているもの以外に、実は自分でも作ることもできます。関数とは、「何か値を受け取って、その値を加工して、内部で処理をして、結果を返すもの」です。
(中略)
関数を自分で作り、記述することを、関数を「定義する」と表現します。Pythonではdefという構文を使って定義します。(defは「define(定義する)」の略語です。)
関数を定義するときは、何か適当な関数名が必要です。

>>>def 関数名(渡したい値をカンマで区切ったもの):
>>>  実行したい文が続く

「実行したい文」は、forやwhile、ifなどの構文と同様に、インデントして書きます。また、「実行したい値をカンマで区切たもの」は、関数で処理したい値のことで、これを「引数(ひきすう)」と言います。
----------------

なんと...関数は作れるということで、自作関数についてを学ぶことになるようです。
ここで例として挙げられているのが、次の文です。

-----引用-----
>>>def tashizan(a,b):
>>> total = 0
>>> for i in range(a,b +1 ):
>>> total = total +i
>>> return total
----------------

これは、新たにtashizanという関数を作り、その役割を「受け取ったaからbまでの合計を求める」ように定義したものなのだそうです。
あくまでtashizanという新たに作られた関数なので、このままでは当然結果となる値を出すことはできません。そのため、関数tashizanを実行するにはaとbに値を代入するための文章を追加してあげる必要があります。それがこの画像の赤枠の部分に当たります。(サンプルコードを利用しています。)

fig01

この赤枠内に書かれている情報によって、aには1、bには5が代入されます。そのあとは通常通りに動くことになります。その処理は次のような流れになります。

①range(a,b +1)はrange(1,5+1)になり、変数iに1~5までの値が順番に代入される
(※ range(1,5)のままであれば、1~4と言う意味になりますが、b+1とされているため、bは5になります。rangeを振り返りたい方はこちらの記事もぜひご覧ください。)

②total=total+iで足し算が行われる
(totalには初期値として0が設定されています。そして、iには5が代入されるまで1~5の値が順次代入されます。そして、この繰り返しをしている間、totalには加算がされた値が入れられることになります。つまり、0+1、1+2、3+3、6+4、10+5という足し算が行われるということになります。)

③繰り返しが終わればプログラムが終了となり、print(c)によって、計算結果(=15)が表示されます。

returnとは何者だ

ところで、関数tashizanの最後に「return total」とあります。この行を削除すると「None」と表示され、「total」だけを消してみても「None」と表示されました。
この「return」は何者なのか。テキストではこのように書かれていました。

-----引用-----
returnを使って結果となる値を設定することを「値を返す(返す=returnの和訳)」や「値を戻す(戻す=returnの和訳)」などと表現し、この値のことを「戻り値」と言います。
結果を返す必要がない時は、戻り値を返さないこともできます。返さないときは「return」とだけ記述するか、returnの行自体を省略します。
----------------

戻り値は返り値とも呼ぶこともあるそうですが、これは関数を実行して出た答えを返答するためのもののようです。
先ほどのサンプルコードで言えば、「retrun total」と書かれていましたので、プログラムが終わったらtotal(合計)の値を返せということを意味しているということになります。

printではだめなんだろうか...。と、疑問に思ったので、実験として、①サンプルコードの「return total」を「print(total)」に変更し、「print(c)」を削除してみたところ結果は表示されました。

fig02

ちなみに、②「print(c)」を消しただけ、③「print(c)」を消し、tashizanの関数の最終行に「print(total)」を追加する、もやってみましたが、こちらはいずれもエラーは出ませんが、結果は表示されませんでした。

fig03

returnとprintの違い

さて、上の結果を見ていて思ったのですが、returnじゃなくて、printでもよくない...?
とか考えて調べてみたところ、そもそもの役割が違うので必要なのだそうです。それぞれの役割を改めてまとめてみると次のようになります。

return = 関数の呼び出し元(※)に値を返して、関数を終了させるもの
print  = 文字を表示(出力)させるもの

(※)のところで言う関数の呼び出し元とは、サンプルコードで言えば「c=tashizan(1,5) print(c)」が該当します。tashizan関数の「return total」にたどり着いた時には関数でやるべき処理を終えているので、「total」の値を、関数の呼び出し元である「c=tashizan(1,5) print(c)」に渡したら関数tashizanは終了して、次の処理に移るという考え方になるようです。

さらに、returnで返された値は他の関数でも利用できるようですので、サンプルコードのように、処理の直後に結果を表示させることも、何かしらの処理中に戻り値を利用する(別の関数に組み込む)こともできます。私は計算結果を入れた箱のまま保有することができるというイメージで落ち着きました。
その一方でprintはあくまで結果を表示させるためのものとして利用することになります。

実験

ではここで実験してみます。
まずは円周を求める関数を作り、3つの円の円周を答えてもらうものを作ってみました。

fig04

直径が3、4、5の円があったときに、それぞれの円周はいくつかというものになります。これを実行するとそれぞれの結果を表示します。(答えを並べるだけだとわかりにくいので、それぞれの結果の頭には①②③とつけています。)
return ensを書いておけば問題なく結果は出ますが、この部分を削除してみたら、結果はNoneとなりました。

さて次にreturnを省略したものです。恒例の某国民的ご一家にご登場いただきました。

fig05

これは磯野さんか、磯野さんではないか、ということを宣言いただくものです。
磯野さんは現在、父・母・長男・次女で構成され、長女は嫁ぎ、フグ田さんになっております。また、長女の夫、長女の子は当然、磯野さんではありません。それぞれの人物の名前に応じて、磯野かそうでないかを説明して頂きました。
ここでは特に引き渡したい値があるわけではないので、returnを省略しても問題ありません。

それでは今回はここで終了です。
この関数の項目では注意しなくてはならないことがあるとテキストにありましたので、次回はその部分についてまとめてみたいと思います。
今回もお付き合いいただきありがとうございました。

参考サイト
戻り値をマスターしよう!Pythonのreturn文の使い方を簡単解説|Tech Teacher Blog
Pythonでreturnを使う方法【初心者向け】|TECH ACHADEMY

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes