【Python】returnで複数の値を返す・受け取る方法

【Python】returnで複数の値を返す・受け取る方法

公開: 更新:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

Python関数を書いているとき、「2つ以上の値をまとめて返したいが、どう書けばよいか分からない」と悩む方は少なくありません。1つの変数しか返せないと思い込んでいるケースやタプルで返せると知っていても受け取り方が分からないケースもよく見られます。

Pythonの関数では、returnで複数の値を返す方法がタプル・リスト・辞書の3パターン用意されており、それぞれ異なる特性を持っています。パターンを正しく選べないと、コードの可読性が下がったり、受け取り側の処理が複雑になったりすることがあります。

この記事では、関数から複数の戻り値を返す各パターンの書き方とコード例を詳しく解説し、受け取り方や使い分けの判断基準についても具体的に説明していきます。



Pythonのreturnで複数の戻り値を返す方法

Pythonでは、カンマ区切りのがタプルを生成する言語仕様があり、return文にカンマ区切りで値を並べると結果的にタプルとして返されます。つまりreturn a, breturn (a, b)と等価です。

以下の3つのパターンを使い分けることで、状況に応じた実装ができます。

  1. タプルで返す方法
  2. リストで返す方法
  3. 辞書で返す方法

タプルが最も基本的な返却方法であり、リストや辞書は返した後に操作が必要な場合やキー名で管理したい場合の代替手段です。それでは各パターンについて、詳しく解説していきます。

タプルで返す方法

タプルとは、変更不可(イミュータブル)な順序付きシーケンスのことです。Pythonではカンマがタプルを構成する構文要素であり、括弧は省略可能です。

return文にカンマ区切りで値を並べるだけで、タプルとして返されます。なお、要素が1つだけのタプルを作る場合は(x,)のように末尾カンマが必須です。

Tuples are immutable, and usually contain a heterogeneous sequence of elements that are accessed via unpacking (see later in this section) or indexing

出典:Python公式チュートリアル - Tuples and Sequences
def calc_sum_avg(a, b):
    """2つの数値の合計と平均をタプルで返す関数"""
    total = a + b
    average = total / 2
    return total, average  # カンマ区切りでタプルが生成される

# アンパック(分割代入)で受け取る
result_sum, result_avg = calc_sum_avg(10, 20)
print(result_sum)   # 30
print(result_avg)   # 15.0

# タプルのままで受け取ることも可能
result = calc_sum_avg(10, 20)
print(result)        # (30, 15.0)
print(result[0])     # 30 (インデックスアクセス)
print(type(result))  # <class 'tuple'>

上記のコードでは、return total, averageと書くだけで(30, 15.0)というタプルが返されます。受け取り側でアンパックを使うと、result_sumresult_avgにそれぞれの値を直接代入できます。

タプルで返す方法は記述量が少なく、返す値の数が2〜3個程度で順序に意味がある場合(最小値と最大値、幅と高さなど)に特に扱いやすいパターンです。タプル自体はイミュータブルなため要素の差し替えや追加はできませんが、要素としてリストなどのミュータブルなオブジェクトを含む場合は、その内部の値は変更できる点に注意してください。

リストで返す方法

リストは変更可能(ミュータブル)な順序付きシーケンスのことで、返す要素の数が事前に決まらない場合や受け取った後に要素を追加・変更する必要がある場合に適した返却手法です。「検索結果一覧」や「フィルタ後の要素集合」のように、同種の値を可変個返すケースで特に有効です。

なお、return evens, oddsのようにカンマ区切りで書くと戻り値はタプルです。リストそのものを1つの戻り値として返す場合は、return [a, b]のようにリストリテラルで明示するか、リスト変数を単体で返します。

def split_even_odd(numbers):
    """整数リストを偶数リストと奇数リストに分けて返す関数"""
    evens = [n for n in numbers if n % 2 == 0]
    odds  = [n for n in numbers if n % 2 != 0]
    return [evens, odds]  # 2つのリストを1つのリストにまとめて返す

# インデックスで受け取る
nums = [1, 2, 3, 4, 5, 6]
result = split_even_odd(nums)

print(result[0])       # [2, 4, 6]
print(result[1])       # [1, 3, 5]

# 受け取ったリストを後から変更できる
result[0].append(8)
print(result[0])       # [2, 4, 6, 8]
print(type(result))    # <class 'list'>

上記のコードでは、return [evens, odds]とすることにより、戻り値のがリストです。result[0].append(8)のように受け取った後から要素を追加できる点が、タプルとの違いです。

タプルとリストの使い分けの基準は、返す値の性質です。異なる意味を持つ固定個の値(名前と年齢など)にはタプルが適しており、同種の値を可変個返す場合はリストが適切です。

受け取った後に要素を操作する必要がある場合もリストを選ぶと、コードの意図が明確です。


Python研修一覧はこちら

目的に合うPython研修を一覧形式から探したい方は、ぜひご利用ください。

Python研修を比較する

Java研修一覧はこちら

目的に合うJava研修を一覧形式から探したい方は、ぜひご利用ください。

Java研修を比較する

PHP研修一覧はこちら

目的に合うPHP研修を一覧形式から探したい方は、ぜひご利用ください。

PHP研修を比較する

新入社員研修

目的に合う新入社員研修を一覧形式から探したい方は、ぜひご利用ください。

新入社員研修を比較する

全ての研修からも探したい方はこちら

辞書で返す方法

辞書(dict)は、キーと値のペアでデータを管理するデータ構造のことで、各戻り値にキー名を付けることで可読性を高められます。インデックス番号ではなく意味のある名前でアクセスしたい場合や返す値の数が多い場合に特に適しています。

def analyze_text(text):
    """テキストを解析して文字数・単語数・行数を辞書で返す関数"""
    return {
        "char_count": len(text),
        "word_count": len(text.split()),
        "line_count": text.count("\n") + 1,
    }

sample = "Hello World\nPython Return\nMultiple Values"
result = analyze_text(sample)

# キー名でアクセスする
print(result["char_count"])  # 38
print(result["word_count"])  # 6
print(result["line_count"])  # 3

# 辞書全体を表示する
print(result)
# {'char_count': 38, 'word_count': 6, 'line_count': 3}
print(type(result))  # <class 'dict'>

辞書で返す方法では、result["char_count"]のようにキー名で値を取り出せるため、戻り値の役割が一目で分かります。なお、上記の行数カウントは改行文字の個数に1を加える簡易的な算出方法であり、空文字列の場合は0行ではなく1を返す点に留意してください。

通常の辞書では、各キーに対する型をコード上で明示しにくいため、どのキーにどの型の値が入るかをドキュメント文字列(docstring)で補足するとよいでしょう。キーごとの型を明示したい場合は、Python 3.8以降で使えるtyping.TypedDictを検討してください。

以下は、3つのパターンの特性をまとめた比較表です。

パターン 変更可否 アクセス 適した場面
タプル 不可 インデックス 固定個の異なる値を返す場合
リスト インデックス 同種の値を可変個返す場合
辞書 キー名 値が多くキー名で管理したい場合

戻り値の数が少なく変更不要ならタプル、返した後に操作が必要ならリスト、キー名でアクセスしたい場合は辞書と覚えておくと、場面に応じた選択がしやすくなります。

Pythonで複数の戻り値を受け取る方法

タプルやリストとして返された複数の戻り値は、呼び出し側でアンパックを使って個別の変数に受け取れます。辞書で返した場合はキー名、dataclassで返した場合は属性名でアクセスするため、ここではタプルやリスト返却時の受け取り方に絞って解説します。

受け取り方には、以下の2つのパターンがあります。

  1. アンパックで個別の変数に受け取る方法
  2. 不要な戻り値を_で捨てる方法

いずれのパターンも、シーケンス型の要素を複数の変数に分配するアンパックという仕組みを活用します。それぞれの使い方について、詳しく解説していきます。

アンパックで個別の変数に受け取る方法

アンパックとは、タプルやリストなどのシーケンス型の各要素を、複数の変数に一度に代入する構文のことです。関数がreturnで複数の値を返す場合、左辺に変数をカンマ区切りで並べるだけで各戻り値を個別の変数として受け取れます。

以下のコードは、名前と年齢を返す関数の戻り値を、アンパックで2つの変数に受け取る例です。

def get_user_info():
    name = "田中太郎"
    age = 30
    return name, age

# アンパックで個別の変数に受け取る
user_name, user_age = get_user_info()

print(user_name)  # 田中太郎
print(user_age)   # 30

上記のコードでは、user_name, user_age = get_user_info()の1行で、関数が返した2つの値がそれぞれの変数に割り当てられます。アンパックを使わずにresult = get_user_info()と受け取ると、変数resultにはタプル('田中太郎', 30)がそのまま格納されるため、個別にアクセスする際はresult[0]result[1]のインデックス参照が必要です。

アンパックを使うと変数名で意味が明確になるため、コードの可読性が向上します。通常のアンパックでは左辺の変数の数と戻り値の要素数が一致している必要があり、一致しない場合はValueErrorが発生します。

ただし、次項で紹介する*を使ったスター式アンパックを使えば、要素数が可変でも対応できます。

受け取り方 構文例 特徴
タプルのまま受け取る result = func() インデックスで参照する必要がある
アンパックで受け取る a, b = func() 変数名で直接参照でき可読性が高い

基本的にはアンパックを優先し、インデックス参照は動的に要素を選択する必要がある場合など限定的な場面に留めるのが望ましいです。

不要な戻り値を_で捨てる方法

関数が複数の値を返す場合でも、呼び出し元で必要なのが一部の値だけのケースがあります。そのような場合、不要な戻り値の受け取り先としてアンダースコア(_)を使うのが、Pythonの慣用的な書き方です。

_は「使わない値の受け捨て先」として広く使われる慣例的な変数名で、意図的に無視することを明示できます。

以下のコードは、3つの値を返す関数から、2番目の値だけを無視して受け取る例です。

def get_scores():
    math_score = 85
    english_score = 72
    science_score = 90
    return math_score, english_score, science_score

# 英語のスコアだけを無視して受け取る
math, _, science = get_scores()

print(math)     # 85
print(science)  # 90

上記のコードでは、math, _, science = get_scores()とすることによって、英語のスコアを_に受け取って実質的に捨てています。_自体は有効な変数名なので技術的にはアクセス可能ですが、「この値は使わない」という意図を読み手に伝える慣習として活用されます。

先頭や末尾の戻り値をまとめて無視したい場合は、*_を使ったスター式のアンパックも有効です。以下の例では、先頭の1つだけを取り出し、残りをまとめて捨てています。

def get_ranking():
    return "1位", "2位", "3位", "4位", "5位"

# 1位だけ取り出し、残りは捨てる
first, *_ = get_ranking()

print(first)  # 1位
print(_)      # ['2位', '3位', '4位', '5位'] ※リストになる

*_はスターアンパック(拡張アンパック)と呼ばれる構文で、残りの要素をまとめてリストとして受け取ります。元の戻り値がタプルであっても、*付き変数は常にリストになる点に注意してください。

また、*を付けられる変数は1つのアンパック式の中で1つだけという制約があります。

用途 構文例 説明
中間の値を1つ捨てる a, _, c = func() 2番目の戻り値を無視する
末尾の複数の値を捨てる a, *_ = func() 最初の値だけ取り出し残りを捨てる
先頭の複数の値を捨てる *_, z = func() 最後の値だけ取り出し先頭側を捨てる

_を使った受け取りは、コードレビューの際に「意図的に無視した」と伝わるため、不要な変数が残るよりも明確なコードです。


Python基礎・実践(Django)

企業・法人向けのPython研修では、基礎から応用まで体系的に学べます。

Python研修の詳細

DX社員研修

企業・法人向けのDX研修では、実務に繋がるリスキリングでITレベルを向上させます。

DX研修の詳細

Javaエンジニア育成研修

企業・法人向けのJavaエンジニア育成研修では、Javaの基礎から応用まで確実に習得できます。

Java研修の詳細

新卒・新入社員向け研修

企業・法人に新入社員・新卒社員に向けたプログラミング研修を提供しています。

新入社員研修の詳細

コードキャンプのIT研修を全て見る

Pythonのreturnで複数の戻り値を返す際のよくある質問

タプルとリストのどちらで返すべきですか?

戻り値の要素数と型が固定されている場合はタプル、要素を後から追加・削除する可能性がある場合はリストを選ぶのが基本です。タプルはイミュータブル(変更不可)なため意図しない変更を防げ、関数の戻り値には特別な理由がない限りタプルが推奨されます。

戻り値が多すぎる場合はどうすればよいですか?

戻り値が4つ以上に増えてきた場合は、dataclasstyping.NamedTupleを使って属性名を持つオブジェクトとして返すことを検討してください。いずれも型ヒントを明示でき、静的解析ツールやIDEの補完に対応するため、コードの可読性が向上します。

なお、dataclassはデフォルトではミュータブルであり、不変にしたい場合は@dataclass(frozen=True)を指定します。

複数の戻り値に型ヒントを付けるにはどう書きますか?

複数の値をタプルで返す場合、Python 3.9以降ではtuple[str, int]のように小文字で直接記述できます。3.8以前では、一般的にはfrom typing import TupleでインポートしたTuple[str, int]を使います。

型ヒントとは、関数の引数や戻り値に期待する型を注釈として記述する仕組みで、ランタイムでは強制されず静的解析ツールやIDE補完向けの記述です。

なお、tuple[str, ...]のように省略記号を使う記法は「全要素がstr型で、要素数が任意のタプル」を意味します。異なる型が混在する場合はtuple[str, int, float]のように全て列挙する必要があります。

※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。

ITやプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 3.5日の研修で、年間1,600時間の削減効果が見込まれる。東京きらぼしフィナンシャルグループのDX人材育成事例 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する