タプルのアンパックで複数値をまとめて受け取る
タプルのアンパック とは
タプルやリストを複数の変数に同時代入するアンパックの基本を学びます。本レッスンでは、タプルのアンパック の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
タプルのアンパックで複数値をまとめて受け取る
Python には他の多くの言語にはない、シンプルで美しい構文がたくさんあります。その代表格が タプルのアンパック です。a, b = (1, 2) のように、複数の値を 同時に変数へ取り出せる 機能で、Python のコードがすっきり見える理由の一つでもあります。関数の複数戻り値、辞書の items()、enumerate zip の戻り値、どれもタプルです。アンパックを使いこなせると、Python のあらゆる API が一段と扱いやすくなります。
アンパックの基本は 「左辺の変数の数」と「右辺の要素数」が一致すること。一致しないと
ValueError: too many values to unpackやnot enough valuesが出ます。
基本構文
左辺にカンマ区切りで変数を書き、右辺にタプル (またはリスト) を置きます。
Python
pair = (10, 20)
a, b = pair
print(a) # 10
print(b) # 20カッコは省略可能で、a, b = 10, 20 でも OK。Python はカンマを見るとタプルだと解釈するので、return a, b のように関数の戻り値でもタプルとして扱われます。
swap (値の入れ替え)
アンパックの定番技として swap があります。下記のとおりです。
Python
x, y = 1, 2
x, y = y, x # 値を入れ替え
print(x, y) # 2 1他言語のような一時変数 temp は不要。右辺で先にタプル (y, x) が作られ、それから左辺にアンパックされる ため、安全に入れ替えできます。Python の名物的なテクニックです。
for ループとの相性
for ループとアンパックの組み合わせは、Python で最も使われる構文の一つ。下記のとおりです。
Python
points = [(0, 0), (1, 2), (3, 5)]
for x, y in points:
print(f"x={x}, y={y}")各要素 (0, 0) (1, 2) (3, 5) がアンパックされて x と y に同時に入る、これがアンパックの強み。enumerate も zip も dict.items() も同じ仕組みで動いていて、Python の for ループは タプルアンパック前提 で設計されています。
動きを追ってみる
アンパックは見た目以上にシンプルな仕組みです。要素を 1 つずつ取り出して、左辺の変数に順番に当てはめる、それだけ。要素数が合わないとエラーになる、というルールさえ守れば自由に使えます。
* で残りをまとめる
Python 3 では、*変数 を使って 「残りを全部 1 つのリストに集める」 ことができます。下記のとおりです。
Python
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]
*init, last = [1, 2, 3, 4, 5]
print(init) # [1, 2, 3, 4]
print(last) # 5*rest がリスト型になるのがポイント。「先頭だけ抜き出して、残りを後で処理」というシーンで重宝します。head, *tail というパターンは、関数型言語でもよく見るイディオムです。
よくある間違い
- 要素数が合わない。
a, b = (1, 2, 3)はValueError。変数の数 = タプルの要素数 が原則です。 - 不要な変数に値を入れたくない時は
_を使う。first, _, third = (1, 2, 3)のように書けば「真ん中は捨てる」と表現できます。 - 関数の戻り値を 1 つの変数で受け取ると タプルのまま になります。
result = func()だとresult = (a, b)で、a, b = func()だとアンパック。違いを意識しましょう。
アンパックは「タプルを 同時 に変数へ分解する」言語機能。
return a, bで複数値を返し、呼び出し側でx, y = func()と受ける、これが Python の流儀です。
アンパックは Python の文化の一部。
for k, v in d.items()のような書き方が自然にできるのは、アンパックがあるからです。
関数の複数戻り値で活躍
Python では関数が複数の値を返すとき、自然と「タプル」として返ります。受け取る側はアンパックで分解、というのが定番パターンです。
Python
def divmod_custom(a, b):
return a // b, a % b
q, r = divmod_custom(17, 5)
print(q, r) # 3 2return a, b の見た目はタプルそのもの。呼び出し側で q, r = func() と書くだけで、複数の戻り値を 直感的 に扱えます。これが他の言語では珍しい Python の心地よさです。
やってみよう
2 要素のシーケンス pair を受け取り、順序を入れ替えたリスト [b, a] を返す関数 swap_pair を書いてみましょう。アンパックで a, b = pair と分解し、return [b, a] で返せば 2 行で完成します。テストの安定性のために戻り値はリストにそろえます。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は 最終総まとめクイズ で、タプルやリストを複数の変数に同時代入するアンパックの基本を学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- タプルアンパック の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. タプルアンパック とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- アンパック
a, b = pairを使う return b, aでタプルを返す- 元の
pairを変更しない
入出力例
test-cases.txt
swap_pair([1,2]) → [2,1]
swap_pair([-5,10]) → [10,-5]
swap_pair([0,7]) → [7,0]
swap_pair([3,3]) → [3,3]