05-Python

Python(Part.–)| python【ユーザー定義関数(2)】| 【return文】

python| まとめ | 現役エンジニア&プログラミングスクール講師「python」のまとめページです。pythonに関して抑えておきたい知識や文法やにについて記事をまとめています。まとめページの下部には「おすすめの学習書籍」「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中...

目標

「return文」について理解する
「return文」の利用方法(返却する値がない場合)
「return文」の利用方法(値を返却する場合)
「return文」の利用方法(値の返却に条件を用いる場合)

「return文」の概要

「return文」は単純文のひとつで、関数内で利用します。「return文」が実行されると、その関数は終了し、呼び出し元のプログラムへ処理を戻します。更に、「return文」に返却すべき値がある場合は、関数内で生成した値(値が複数の場合もあり)を呼び出し元のプログラムへ返却します。

引用:https://docs.python.org/ja/3/reference/simple_stmts.html

「return文」は実行された場合、次の処理を行います。

  • 関数の処理を終了する。
  • return文の後ろに式(値や変数、計算式)がある場合、その値をプログラムの呼び出し元へ返却する。

「return文」の利用方法

返却する値がない場合

ユーザー定義関数で返却する値がない場合、return文の利用は次の3通りが考えられます。

  • 「return文」を省略するパターン
  • 「return文」のみを置くパターン
  • 「return文」に続けて「None」を置くパターン

これらは、何れの場合も、組み込み定数の「None」を返す仕組みとなっています。何れも、「None」を返すのであれば、どのパターンを利用しても構わないように思えますが、関数の振る舞いを工夫する点では、異なるパターンを使用することが考えられます。

「どのタイミングで関数の処理を終了させるか」という点で「return文」を省略するか、省略しないかを考えます。

「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」を返します。

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を明示しない場合と同じになります。

返却する値がない場合で、return文を省略しない場合、pythonでは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)))

実行結果

今回は以上になります。

「python」おすすめ書籍 ベスト3 | 現役エンジニア&プログラミングスクール講師「python」の学習でお勧めしたい書籍をご紹介しています。お勧めする理由としては、考え方、イメージなどを適切に捉えていること、「生のpython」に焦点をあてて解説をしている書籍であることなどが理由です。勿論、この他にも良い書籍はありますが、特に質の高かったものを選んで記事にしています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST