目標
「return文」について理解する
「return文」の利用方法(返却する値がない場合)
「return文」の利用方法(値を返却する場合)
「return文」の利用方法(値の返却に条件を用いる場合)
「return文」の概要
「return文」は単純文のひとつで、関数内で利用します。「return文」が実行されると、その関数は終了し、呼び出し元のプログラムへ処理を戻します。更に、「return文」に返却すべき値がある場合は、関数内で生成した値(値が複数の場合もあり)を呼び出し元のプログラムへ返却します。
引用:https://docs.python.org/ja/3/reference/simple_stmts.html
「return文」の利用方法
返却する値がない場合
ユーザー定義関数で返却する値がない場合、return文の利用は次の3通りが考えられます。
- 「return文」を省略するパターン
- 「return文」のみを置くパターン
- 「return文」に続けて「None」を置くパターン
これらは、何れの場合も、組み込み定数の「None」を返す仕組みとなっています。何れも、「None」を返すのであれば、どのパターンを利用しても構わないように思えますが、関数の振る舞いを工夫する点では、異なるパターンを使用することが考えられます。
「return文」を省略するパターン
return文を利用しない場合は、関数内の処理で必要な個所を最後まで全て行い、そのうえで「None」を返します。
def methodName(param1, param2, param3):
if param1 == 0:
print(param1)
elif param2 != 0:
print(param2 * param3)
print('関数の処理が全て行われました。')
print(methodName(0, 0, 3))
# 実行結果
# 0 (条件param1 == 0のブロックの処理です。)
# 関数の処理が全て行われました。(関数methodNameのブロックの最後の処理です。)
# None (関数methodNameのブロックの処理全てが完了して返されるNoneです。)
print(methodName(0, 2, 3))
# 実行結果
# 0 (条件param1 == 0のブロックの処理です。)
# 関数の処理が全て行われました。(関数methodNameのブロックの最後の処理です。)
# None (関数methodNameのブロックの処理全てが完了して返されるNoneです。)
print(methodName(1, 0, 3))
# 実行結果 (if文のブロックの処理は行われません。)
# 関数の処理が全て行われました。(関数methodNameのブロックの最後の処理です。)
# None (関数methodNameのブロックの処理全てが完了して返されるNoneです。)
print(methodName(1, 2, 3))
# 実行結果
# 6 (条件param2 != 0のブロックの処理です。)
# 関数の処理が全て行われました。(関数methodNameのブロックの最後の処理です。)
# None (関数methodNameのブロックの処理全てが完了して返されるNoneです。)
「return文」のみを置くパターン
return文を利用する場合は、返却値に「None」を明示するしないに関わらず、return文が実行された時点で関数を終了し、「None」を返します。
def methodName(param1, param2, param3):
if param1 == 0:
print(param1)
return
elif param2 != 0:
print(param2 * param3)
return
print('関数の処理が全て行われました。')
return
print(methodName(0, 0, 3))
# 実行結果
# 0 (条件param1 == 0のブロックの処理です。)
# None (条件param1 == 0のブロックのreturn文で返却されたNoneです。)
print(methodName(0, 2, 3))
# 実行結果
# 0 (条件param1 == 0のブロックの処理です。)
# None (条件param1 == 0のブロックのreturn文で返却されたNoneです。)
print(methodName(1, 0, 3))
# 実行結果 (if文のブロックの処理は行われません。)
# 関数の処理が全て行われました。 (関数methodNameのブロックの最後の処理です。)
# None (関数methodNameのブロックのreturn文で返却されたNoneです。)
print(methodName(1, 2, 3))
# 実行結果
# 6 (条件param2 != 0のブロックの処理です)
# None (条件param2 != 0のブロックのreturn文で返却されたNoneです。)
「return文」に続けて「None」を置くパターン
return文を利用し、返却値に「None」を明示した場合、結果はNoneを明示しない場合と同じになります。
def methodName(param1, param2, param3):
if param1 == 0:
print(param1)
return None
elif param2 != 0:
print(param2 * param3)
return None
print('関数の処理が全て行われました。')
return None
print(methodName(0, 0, 3))
# 実行結果
# 0 (条件param1 == 0のブロックの処理です。)
# None (条件param1 == 0のブロックのreturn文で返却されたNoneです。)
print(methodName(0, 2, 3))
# 実行結果
# 0 (条件param1 == 0のブロックの処理です。)
# None (条件param1 == 0のブロックのreturn文で返却されたNoneです。)
print(methodName(1, 0, 3))
# 実行結果 (if文のブロックの処理は行われません。)
# 関数の処理が全て行われました。 (関数methodNameのブロックの最後の処理です。)
# None (関数methodNameのブロックのreturn文で返却されたNoneです。)
print(methodName(1, 2, 3))
# 実行結果
# 6 (条件param2 != 0のブロックの処理です)
# None (条件param2 != 0のブロックのreturn文で返却されたNoneです。)
値を返却する場合
値の返却がある場合、値が「ひとつ」か「複数」かでreturn文の後にくる式の形が変わります。また、何れの場合も、返却された値は関数が利用された場所で、関数がその値に置き換わるイメージで利用されます。
「値」が「ひとつ」の場合
返す値が「ひとつ」の場合は、型の違いに関わらず、return文の直後に「リテラル」または「変数」を置きます。
# 三角形の面積を求める関数
def triangleArea(triangle_base, triangle_height):
# 底辺 × 高さ ÷ 2
triangle_area = triangle_base * triangle_height / 2
# 面積の値を返却
return triangle_area
print('三角形の面積は{}です。'.format(triangleArea(3, 6)))
実行結果
関数は呼び出され、呼び出されたときの条件(引数の値など)に従って実行されます。
関数にreturn文がある場合、return文によって返された値は、関数を呼び出した箇所に戻されます。
関数が返却する値は、同じ関数であっても、内部で行う処理によって「数値」の場合もあれば「文字列」など、別のリテラルの場合もあります。pythonのユーザー定義関数では、関数が返却する値について「この関数ではこの型の値が返らなければいけない。」などの制約はありません。
返却する値の型が条件分岐によって変わる関数の例
# 三角形の面積を求める関数
def triangleArea(triangle_base, triangle_height):
if triangle_base >= 0 and triangle_height >= 0:
# 底辺 × 高さ ÷ 2
triangle_area = triangle_base * triangle_height / 2
# 面積の値を返却
return triangle_area
else:
return '計算できません'
print('三角形の面積は{}。'.format(triangleArea(4, 5)))
print('三角形の面積は{}。'.format(triangleArea(-3, 5)))
上の関数の実行結果は、ひとつ目の関数の呼び出しでは、triangleArea(4, 5) に「10.0」が返され、triangleArea(-3, 5) に「計算できません」が返されます。
実行結果
「値」が「複数」の場合
return文を利用して関数から複数の値を返却する場合、複数の値を、タプルやリストなどのイテラブルオブジェクトに格納して返却を行います。
返却を行ったタプルやリスト内の其々の値はアンパックして個別の変数に結びつけます。
# 三角柱の底面積と体積を求める関数
def triangularPrismVolume(triangle_base, triangle_height, prism_height):
# 底面の三角形の底辺 × 底面の三角形の高さ ÷ 2
triangle_area = triangle_base * triangle_height / 2
# 三角柱の底面積 × 三角柱の高さ
triangular_prism_volume = triangle_area * prism_height
# 三角柱の底面積と体積の返却
return (triangle_area, triangular_prism_volume )
# アンパック
t_area, t_p_volume = triangularPrismVolume(3, 6, 4)
print('三角柱の底面積は{}、体積は{}です。'.format(t_area, t_p_volume ))
実行結果
関数triangularPrismVolume()ではreturn文の後に、ふたつの値をタプル利用して、ひとつのオブジェクトとして返しています。
下のキャプチャではtriangularPrismVolume(3, 6, 4)の個所にタプル(9.0, 36.0)が返ることになります。
返された値は戻された場所で代入演算子を利用して、準備したふたつの変数「t_area」と「t_p_volume」に前から順番に紐づけを行っています(アンパック)。今回は「t_area」に「9.0」が、「t_p_volume」に「36.0」が紐づいています。
値の返却に条件を用いる場合
return文で値を返却する時に、条件によって返却する値を変更設定することができます。記述方法は次の通りです。
※この内容は三角形の面積を求める関数triangleArea()のブロック内の処理を書き換えたものです。プログラムがかなりスッキリとした形になります。
# 三角形の面積を求める関数
def triangleArea(triangle_base, triangle_height):
# 底辺 × 高さ ÷ 2
triangle_area = triangle_base * triangle_height / 2
# 面積の値を返却
return triangle_area if triangle_base >= 0 and triangle_height >= 0 else '計算できません'
print('三角形の面積は{}。'.format(triangleArea(4, 5)))
print('三角形の面積は{}。'.format(triangleArea(-3, 5)))
実行結果
今回は以上になります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。