Python

【Python】アンパックの使い方

この記事では、Pythonのアンパック仕方について解説します。アンパックを使うことで、まとまったデータをバラバラに分解し、それぞれ変数に代入できます。また、関数などの引数に、リストや辞書をアンパックして渡すこともできます。

それでは、アンパックの使い方を見ていきましょう!

アンパックの使い方

アンパックするには、要素の数だけ変数を用意し、以下のように記述します。

変数1, 変数2, ..., 変数N = [要素1, 要素2, ..., 要素N]

上記の例では、リストを使ってますがシーケンス型のオブジェクトならアンパックすることができます。

サンプル

以下のコードでは、タプルをアンパックしてそれぞれの変数に代入しています。

vals = (1, 'Mike', 21)

# 要素数が3なので変数を3つ用意
no, name, age = vals

print(f'No. {no}, name: {name}, age: {age}')

実行結果

No. 1, name: Mike, age: 21

辞書のアンパック

辞書もアンパックすることができます。

d = {'one': 1, 'two': 2, 'three': 3}

k1, k2, k3 = d

print(k1)
# one

print(k2)
# two

print(k3)
# three

それぞれの変数に辞書のkeyを受け取ることができました。

ネストされている配列のアンパック

ネストされている配列もアンパックすることができます。

t = (1, (2, 3))
a, b, = t

print(a)
# 1

print(b)
# (2, 3)

ネストされた部分も展開したい場合は()[]で囲うことで実現できます。

t = (1, (2, 3))
a, (b, c) = t

print(a)
# 1

print(b)
# 2

print(c)
# 3

不必要な値の受け取り

特に必要ないの値がある場合は、その値をアンダースコア(_)で受けとることで、間違って使用しないようにします。

point = (1, 2, 3)
x, y, _ = point

print(x)
# 1

print(y)
# 2

print(_)
# 3

アンダースコアは複数指定できます。

point = (1, 2, 3)
x, _, _ = point

print(x)
# 1

print(_)
# 3

複数の要素を受け取る

変数にアスタリスク(*)を付けることで複数の要素を受け取ることができます。以下コードでは、配列の要素数に対して変数の数が少ないですが、アスタリスクの付いた変数があるため要素を複数受け取ってくれる。

t = (1, 2, 3)

a, *b = t

print(a)
# 1

print(b)
# [2, 3]

当然、前の変数にも付けることができる。

t = (1, 2, 3)

*a, b = t

print(a)
# [1, 2]

print(b)
# 3

ちなみに、ネストされている配列をアスタリスクの付いた変数で受け取ると以下のようになります。

t = (1, (2, 3))

a, *b= t

print(a)
# 1

print(b)
# [(2, 3)]
注意

アスタリスクを付けた変数で値を受け取るとリスト型として受け取られます。

t = (1, 2, 3)

*a, b, c = t

print(a)
# [1]

また、複数付けることはできません。

# これはエラー
*a, *b = t

アンパックして関数に渡す

リストやタプル、辞書をアンパックして関数などの引数に渡すことができます。

リスト・タプルの場合

書式

リストやタプルをアンパックしながら関数に渡すには以下のようにします。

関数名(*変数)

サンプル

例えば、以下のような関数があったとして、

def func(a, b):
    print(a)
    print(b)

この関数に、リストの要素を引き渡そうとすると以下のようになります。

vals = [1, 2]

func(vals[0], vals[1])
# 1
# 2

しかし、アンパックすることで以下のように記述することができます。

func(*vals)
# 1
# 2

特に可変長引数の場合は、とても楽に値を引き渡せます。

def func(*args):
    for arg in args:
        print(arg)


vals = [1, 2, 3]

# 通常
func(vals[0], vals[1], vals[2])
# 1
# 2
# 3

# アンパック
func(*vals)
# 1
# 2
# 3

辞書の場合

書式

辞書をアンパックしながら関数に渡すには以下のようにします。

関数名(**変数)

辞書をアンパックして引数に渡すと、辞書のkeyとvalueを使ってキーワード呼び出しをします。

サンプル

例えば以下のような関数があったとして、

def func(a, b):
    print(a)
    print(b)

この関数にアンパックして辞書を渡すと、以下のようになります。

d = {'a': 1, 'b': 2}

func(**d)
# 1
# 2

キーワード呼び出しなので、要素の順番が異なっても問題ありません。

d = {'b': 2, 'a': 1}

func(**d)
# 1
# 2

もちろん、可変長引数にも使えます。

def func(**kwargs):
    print(kwargs)

d = {'one': 1, 'two': 2, 'three': 3}

func(**d)
# {'one': 1, 'two': 2, 'three': 3}

しかし、keyと引数が一致しない場合はエラーとなります。

def func(a, b):
    print(f'a = {a}, b = {b}')


d = {'a': 1, 'c': 2}
func(**d)
# TypeError: func() got an unexpected keyword argument 'c'
アスタリスクを1つに

実はアスタリスクを1つにしても辞書はアンパックして引数に渡すことができます。その場合、keyのみが渡されます。

def func(*args):
    for arg in args:
        print(arg)


d = {'one': 1, 'two': 2, 'three': 3}

func(*d)
# one
# two
# three

valueのみを渡したい場合は、valuesメソッドを使います。

func(*d.values())
# 1
# 2
# 3

まとめ

この記事では、Pythonのアンパックの使い方について解説しました。アンパックを使うことでリストなどの要素を簡単に関数に渡すことができます。

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

【おすすめ】Python参考書