Python のアスタリスク (*) による List のアンパック
アスタリスクによるリストのアンパックとは?
Python ではアスタリスク * を使って List の内容を別個に取り出して、関数に渡すことができます。
例えば、次の内容のリスト L があるとします。
>>> L = [1, 3, 5]
print() 関数でリストを表示してみましょう。
>>> print(L)
[1, 3, 5]
[ と ] を含めて表示されており、確かにリストであることが確認できます。
ここでもし、リストの内容 (要素) をひとつひとつ関数に渡したい場合はどうしたらよいでしょうか。
ひとつ目の方法としては、インデックスで要素を取り出して、それをひとつひとつ関数に渡すことです。
>>> print(L[0], L[1], L[2])
1 3 5
確かにリストの要素が表示されています。リストとして表示しているのではなく、リストの要素 (ここでは int) を表示しているので、 リストを表す [と] は表示されていません。
もうひとつの方法は、リストにアスタリスク * を付けて関数に渡す方法があります。
>>> print(*L)
1 3 5
確かに要素を一つ一つ渡した場合と、同じ結果になっていますね。
このように、リストの要素をひとつひとつ取り出して関数に渡す操作を、アンパック (unpack) という言い方をします。 英語で unpack というと通常は荷物を開けて中身を出すこといいます。ここでもリストから要素を取り出すというイメージです。
上の例では print() という可変個引数を受け取る関数を例にしましたが、 固定数の引数を受け取る関数でも使えます。
def foo(i, j, k):
print(f"i = {i}, j= {j}, k= {k}")
L = ['Hello', 'World', 'Python']
foo(*L)
1-2行目で関数 foo() を定義していて、4行目でリストを作り、5行目でリストにアスタリスクをつけて foo() 関数に渡しています。
実行結果は次のようになります。
i = Hello, j= World, k= Python
確かにリスト内の要素の順番で、引数 i, j, k に値がセットされていることが確認できます。
リストを作る関数にアスタリスクを適用
アスタリスクは range() 関数のように、リストを返す関数にも適用できます。
次の例では、 range(0,5) を print() にそのまま渡しても、リストの中身ではなく range(0,5) という式自体が表示されています。
>>> range(0, 5)
range(0, 5)
>>> print(range(0,5))
range(0, 5)
そこで次のようにアスタリスクでアンパックすることによって、 print() でリストの内容が表示できています。
>>> print(*range(0,5))
0 1 2 3 4
以上、ここではアスタリスクによるリストのアンパックについて説明しました。