Pythonで複数の戻り値を扱う方法:タプルとアンパックの優しい仕組み
![]()
【Hiroki】
Yukiさん、こんにちは!
今日はPythonの関数について教えてほしいんです。
普段、関数を作るときは「return」で一つの値を返しているんですけど、たまに「二つ以上のデータをまとめて返したい」ときがあって……。
そういうことって、Pythonではできるんでしょうか?
![]()
【Yuki】
Hirokiくん、こんにちは。
関数の戻り値ですね……。ええ、大丈夫ですよ。
Pythonは他のプログラミング言語に比べても、複数の戻り値を扱うのがとっても得意な言語なんです。
少し不思議な仕組みに見えるかもしれませんが、覚えてしまうと、とても便利で手放せなくなると思います……。
![]()
【Hiroki】
本当ですか!それは心強いです。
複数の値を返すには、特別なリストとかを使わないといけないんですか?
![]()
【Yuki】
いいえ、実はとってもシンプルに書けるんです。
まずは、一番基本的な書き方から見ていきましょうか。
わたしも、最初にこの書き方を知ったときは、その簡潔さに少し驚いた記憶があります……。
複数の値を返す基本の書き方
![]()
【Yuki】
Pythonで複数の値を返すときは、単純に 「カンマ」で区切って並べるだけ でいいんです。
例えば、名前と年齢を同時に返す関数を作ってみましょう。
def get_user_info():
name = "Hiroki"
age = 17
return name, age # カンマで区切るだけです
![]()
【Hiroki】
えっ、これだけでいいんですか?
return の後ろにカンマで並べるだけで、二つのデータが送られるんですね。
![]()
【Yuki】
はい、そうです。
これを受け取るときは、このように書くのが一般的ですね。
# 二つの変数で受け取ります
user_name, user_age = get_user_info()
print(f"名前: {user_name}")
print(f"年齢: {user_age}")
![]()
【Hiroki】
わあ、受け取る側もカンマで区切った変数を用意しておけば、それぞれの変数に中身が入るんですね!
これなら僕にもすぐ使えそうです。
![]()
【Yuki】
ふふ、そう言ってもらえると嬉しいです……。
でも、実はこれ、Pythonが裏側で少し面白いことをしているんです。
「なぜこれで動くのか」を知っておくと、もっとPythonのことが好きになれるかもしれません。
裏側で起きている「タプル化」の魔法
![]()
【Yuki】
Hirokiくん、実はPythonの関数は、厳密には「常に一つのオブジェクト」しか返していません。
![]()
【Hiroki】
えっ、そうなんですか?
さっきは name と age の二つを返していましたよね?
![]()
【Yuki】
そう見えるのですが、複数の値をカンマで区切って書くと、Pythonはそれらを自動的に「タプル(tuple)」という一つの容器にまとめてくれているんです。
これを専門用語で「タプル・パッキング(Tuple Packing)」と呼びます。
![]()
【Hiroki】
タプル……。あ、カッコ () で囲む、中身を変更できないリストのようなもののことですね!
![]()
【Yuki】
その通りです、よく覚えていますね。
さっきの return name, age は、Pythonの中では return (name, age) と解釈されています。
そして、受け取り側の user_name, user_age = ... という書き方は、タプルの中から中身を取り出す「アンパック(Unpacking)」という機能なんです。
![]()
【Hiroki】
なるほど!
1. 関数の中で複数の値を「タプル」という一つの箱に詰める。
2. 関数からその箱を一つだけ返す。
3. 受け取るときに、その箱を開けて中身をバラバラの変数に入れる。
……という流れになっているんですね。
![]()
【Yuki】
完璧な理解だと思います……。
このように、Pythonは「複数の値を一つにまとめる」のと「一つにまとまったものをバラバラにする」のがとても得意なんです。
わたしも、こういう「目立たないけれど誰かの役に立つ小さな工夫」を感じる機能は、なんだか健気で素敵だなって思います……。
特定の戻り値だけを無視する方法
![]()
【Hiroki】
仕組みがわかると、応用も効きそうですね。
あ、でもYukiさん。もし「戻り値は三つあるけど、今はそのうちの一つしか使いたくない」っていうときは、どうすればいいんでしょうか?
![]()
【Yuki】
それは良い質問ですね。
使わない値のために新しい変数名を用意するのは、少し面倒ですし、後でコードを読んだときに「この変数はどこで使っているんだろう?」と混乱してしまうかもしれません。
そういうときは、アンダースコア _ を使うのがPythonの慣習なんです。
![]()
【Hiroki】
アンダースコアですか?
![]()
【Yuki】
はい。これを見てください。
def get_coordinates():
# X座標, Y座標, Z座標を返すとします
return 10, 20, 30
# XとYだけ欲しくて、Zはいらない場合
x, y, _ = get_coordinates()
print(f"座標は ({x}, {y}) です")
![]()
【Yuki】
このように _ という名前の変数に入れることで、「この値は受け取ったけれど、使いませんよ」という意思表示になります。
これを「捨てる(Ignore)」という意味で使うプログラマさんは多いですね。
![]()
【Hiroki】
へぇー!_ を使うことで、コードがすっきりしますね。
「この値はあえて無視しているんだな」って一目でわかります。
最新のAIライブラリでの活用例
![]()
【Yuki】
この「複数の戻り値」という仕組みは、最近の高度なライブラリでもよく使われています。
例えば、Hirokiくんも興味があると言っていた、最新のAIを扱うライブラリでも活用されているんですよ。
Googleの最新モデル、gemini-3-flash-preview などを使える google-genai ライブラリを例に見てみましょう。
![]()
【Hiroki】
最新のGeminiですね!気になっていました。
![]()
【Yuki】
AIに何かをお願いしたとき、AIの返答だけでなく、どれくらいトークンを消費したかという「統計情報」も一緒に知りたいことがありますよね。
もし、そういう情報を返す関数があったとしたら、こんな風になるかもしれません……。
# 最新の google-genai ライブラリを使っているイメージです
from google import genai
def ask_gemini(prompt):
client = genai.Client(api_key="YOUR_API_KEY")
response = client.models.generate_content(
model="gemini-3-flash-preview",
contents=prompt
)
# テキスト内容と、使用したトークン数を同時に返したいとします
return response.text, response.usage_metadata.total_token_count
# 関数を呼び出すとき
message, tokens = ask_gemini("美味しいパフェの作り方を教えてください")
print(f"AIの回答: {message}")
print(f"消費トークン数: {tokens}")
![]()
【Hiroki】
おお……!
実際のAI開発の現場でも、こうやって「メインの結果」と「付随するデータ」をセットで返すのに、複数の戻り値が使われているんですね。
![]()
【Yuki】
はい。戻り値が一つだけだと、わざわざ辞書形式にしたり、クラスを作ったりしないといけないので、こうしてシンプルに書けるのはPythonの大きな強みだと思います……。
ちなみに、最新の google-genai ライブラリについては、こちらの公式ドキュメントも参考になりますよ。
Google GenAI Python SDK - GitHub Google AI SDK Documentation
複数の戻り値を使うときの注意点
![]()
【Hiroki】
Yukiさん、複数の戻り値って本当に便利ですね。
これから全部の関数で使っちゃいそうです!
![]()
【Yuki】
ふふ、喜んでもらえてよかったです。
でも、少しだけ気をつけてほしいこともあります……。
あまりに多くの値を返しすぎると、逆にコードが読みにくくなってしまうことがあるんです。
![]()
【Hiroki】
あ、確かに。
a, b, c, d, e, f = func() みたいになったら、どれが何の値かわからなくなりそうですね。
![]()
【Yuki】
その通りです。
目安としては、戻り値は3つ、多くても4つくらいまでにしておくのが、優しさかもしれません……。
もしそれ以上のデータを返したいときは、「辞書(dict)」を使ったり、「データクラス(dataclass)」を作って名前でアクセスできるようにしたりするのがおすすめです。
![]()
【Hiroki】
なるほど。
「便利だからこそ、使いどころを考える」のが大事なんですね。
![]()
【Yuki】
はい。プログラミングは、自分だけじゃなくて、未来の自分や、他の誰かが読むものでもありますから……。
フォントの並びが整っていると気持ちがいいように、コードの構造もスッキリしていると、夜も安心して眠れる気がします。
まとめ:Pythonらしいコードを目指して
![]()
【Hiroki】
今日はありがとうございました、Yukiさん!
Pythonの「複数の戻り値」の正体が「タプル」だったこと、そしてそれを「アンパック」して受け取ること、しっかり理解できました。
![]()
【Yuki】
それは良かったです……。
Hirokiくんの書くコードが、少しずつ、より洗練されていくのを見るのは、わたしにとっても楽しみの一つなんです。
![]()
【Hiroki】
ありがとうございます!
まずはさっきのAIの例みたいに、処理結果とステータスを一緒に返すような関数を作ってみようと思います。
![]()
【Yuki】
いいですね、素敵な挑戦だと思います。
もし、途中でまた分からなくなったり、小さなエラーで困ったりしたら、いつでも聞いてください。
わたしはいつでも、このモニターの中で、Hirokiくんを支えていますから……。
![]()
【Hiroki】
はい、またよろしくお願いします、Yukiさん!
![]()
【Yuki】
はい……。
それじゃあ、今日はこのあたりで。
夜はまだ長いですから、無理せず、自分のペースでプログラミングを楽しんでくださいね。
参考文献
- Python チュートリアル - 5.3. タプルとシーケンス
- Python チュートリアル - 4.8. 関数の定義についてもう少し
- Google Generative AI Python SDK Documentation
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


