環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonのタプルをアンパックする(タプルの要素を変数に分離する)

最終更新日 2019.12.02

Python のタプルは各要素を変数に分離できます。これをアンパックといいます。

x, y, z = (1, 2, 3)

print(x)  # 1
print(y)  # 2
print(z)  # 3

変数の数とタプルの要素数が一致しないときは例外が発生します。

x, y, z, w = (1, 2, 3)

# ValueError: not enough values to unpack (expected 4, got 3)

応用:複数の変数にまとめて代入する

タプルは丸かっこを省略できます。

v = 1, 2, 3

print(v)  # (1, 2, 3)
print(type(v))  # <class 'tuple'>

これとアンパックをつなげて考えると、次の画期的なコードが生まれます。

x, y, z = 1, 2, 3

print(x)  # 1
print(y)  # 2
print(z)  # 3

タプル内タプルのアンパック

タプルの中にタプルがある場合もアンパックできます。

a, b, c, v = (1, 2, 3, (4, 5))

print(a)  # 1
print(b)  # 2
print(c)  # 3
print(v)  # (1, 2, 3)
print(type(v))  # <class 'tuple'>

鋭い人は次のコードを実験するでしょう。

a, b, c, (d, e) = (1, 2, 3, (4, 5))

print(a)  # 1
print(b)  # 2
print(c)  # 3
print(d)  # 4
print(e)  # 5

アンパックはデータベースからデータを取得するときに使う

データベースを使う Python プログラマーにとってアンパックは必需品です。次の例はデータベースからデータを取得するときの典型的なコードです。

db.cursor.execute("select * from `user`")
rows = db.cursor.fetchall()
users = []
for r in rows:
    u = User()
    u.id, u.name = r
    users.append(u)

fetchall の各要素はタプルです。タプルは順番をもちますが、この場合はデータベースのテーブル・カラムの順番です。タプルをテーブルに対応したモデルのインスタンスに保存するためには、タプルのアンパックが不可欠です。