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