多くのプログラミング言語では、関数から返せる値(戻り値)は原則として1つだけです。複数の値を返したい場合、配列やオブジェクトに詰め込むなどの工夫が必要になります。
しかし、Pythonではカンマ(,)で区切るだけで、非常に簡単に複数の値を返すことができます。
この記事では、関数から複数の値を返す仕組みと、それを受け取るための「アンパック」という手法について解説します。
複数の値を返す仕組み
Pythonの関数で return a, b のように記述すると、Pythonは内部的にこれらの値を**タプル(tuple)**という一つのデータ構造にまとめて(パッキングして)返します。
つまり、複数の値を返しているように見えますが、実際には「タプルという1つのオブジェクト」を返しています。
具体的なコード例
例として、長方形の「幅」と「高さ」を受け取り、その「面積」と「周長(外周の長さ)」を同時に計算して返す関数を作成します。
def calculate_rectangle_properties(width, height):
"""
長方形の幅と高さから、面積と周長を計算して返す関数
"""
# 面積の計算
area = width * height
# 周長の計算: (幅 + 高さ) * 2
perimeter = (width + height) * 2
# カンマで区切って2つの値を返す(タプルとして返される)
return area, perimeter
# --- 関数の実行 ---
# サイズ定義
rect_width = 5
rect_height = 8
# 関数の呼び出し
result = calculate_rectangle_properties(rect_width, rect_height)
print(f"戻り値: {result}")
print(f"戻り値の型: {type(result)}")
実行結果:
戻り値: (40, 26)
戻り値の型: <class 'tuple'>
このように、戻り値は (40, 26) というタプルになっています。
戻り値の受け取り方(アンパック)
タプルとして返ってきた値を、それぞれ別の変数として扱いたい場合、**アンパック(展開)**という機能を使用します。これはPythonで最も推奨される受け取り方です。
呼び出し元の左辺に、戻り値と同じ数の変数を用意するだけで、自動的に値が分解されて代入されます。
# 戻り値を area_val と perimeter_val にアンパックして代入
area_val, perimeter_val = calculate_rectangle_properties(10, 20)
print(f"面積: {area_val}")
print(f"周長: {perimeter_val}")
実行結果:
面積: 200
周長: 60
不要な戻り値を無視する場合(_ アンダースコア)
関数が複数の値を返すが、そのうちの一部しか必要ない場合は、変数名に _(アンダースコア)を使用するのが慣習です。これにより、「この値は意図的に使っていません」と明示できます。
# 面積だけが必要で、周長は不要な場合
area_only, _ = calculate_rectangle_properties(6, 6)
print(f"正方形の面積: {area_only}")
# _ には周長が入っているが、以降の処理では使わない
実行結果:
正方形の面積: 36
まとめ
- Pythonの関数は
return 値1, 値2と記述するだけで複数の値を返せます。 - 内部的にはタプルとして返されています。
- 呼び出し元では
変数1, 変数2 = 関数()のように記述して、値を個別の変数にアンパックするのが一般的です。 - 不要な値がある場合は
_で受け取ることで、コードの意図を明確にできます。
