
目標
(pythonの)「パック」と「アンパック」について理解する。
「パック」と「アンパック」
「パック」は、複数の値をひとまとめにして、タプルを作成することをいいます。
「アンパック」はタプルやリストから各要素を取り出し、別々にすることをいいます。
「パック」と「アンパック」のプログラム
# パックを行っています。
packDate1 = 1, 2, 3, 4, 5
packDate2 = 'a', 'b', 'c', 'd', 'e'
packDate3 = 'あいうえお', 'かきくけこ', 'さしすせそ'
# パックして生成されたタプルを確認しています。
print(packDate1)
print(packDate2)
print(packDate3)
# アンパックを行っています。
data1_1, data1_2, data1_3, data1_4, data1_5 = packDate1
data2_1, data2_2, data2_3, data2_4, data2_5 = packDate2
data3_1, data3_2, data3_3 = packDate3
# アンパックされた各値を確認しています。
print(data1_1, '/' ,data1_2, '/' ,data1_3, '/' ,data1_4, '/' ,data1_5)
print(data2_1, '/' ,data2_2, '/' ,data2_3, '/' ,data2_4, '/' ,data2_5)
print(data3_1, '/' ,data3_2, '/' ,data3_3)
「パック」(タプルを生成)
次のように、カンマで区切られた複数の値を変数に結び付けるとタプルが生成されます。
# パックを行っています。
packDate1 = 1, 2, 3, 4, 5
packDate2 = 'a', 'b', 'c', 'd', 'e'
packDate3 = 'あいうえお', 'かきくけこ', 'さしすせそ'
# パックして生成されたタプルを確認しています。
print(packDate1)
print(packDate2)
print(packDate3)
実行結果

「アンパック」→(タプルやリスト、文字列の値を個々に取得)
次のように、カンマで区切られた変数を利用するとタプルやリストをアンパックできます。
# アンパックを行っています。
data1_1, data1_2, data1_3, data1_4, data1_5 = packDate1
data2_1, data2_2, data2_3, data2_4, data2_5 = packDate2
data3_1, data3_2, data3_3 = packDate3
# アンパックされた各値を確認しています。
print(data1_1, '/' ,data1_2, '/' ,data1_3, '/' ,data1_4, '/' ,data1_5)
print(data2_1, '/' ,data2_2, '/' ,data2_3, '/' ,data2_4, '/' ,data2_5)
print(data3_1, '/' ,data3_2, '/' ,data3_3)
実行結果

ネストされたオブジェクトの「アンパック」
次のように、ネストされたオブジェクトも変数に紐づけてアンパックできます。
# パックを行っています。
packDate1 = 1, 2, (3, 4, 5)
# アンパックを行っています。
data1_1, data1_2, data1_3 = packDate1
print(data1_1, "/", data1_2, "/", data1_3)
実行結果

様々な「アンパック」の方法(アンダースコアの利用)
アンパックで値を取得する場合、取得の仕方によって様々な記述方法があります。
取得する値のうち、不要なものがある場合「_(アンダースコア)」を利用して、取得を行わないようにます。(※実際は「_(アンダースコア)」は変数として利用されるため、値は「_(アンダースコア)」と紐づけられています(取得されています)。ただ、慣例として不要なものを取得する場合、「_(アンダースコア)」を扱うことが多いため、このような、「取得を行わないとする」解説をしています。)
# パックを行っています。
packDate1 = 1, 2, 3, 4, 5
# アンパックを行っています。
data1_1, _, _, data1_4, _ = packDate1
print(data1_1, "/", data1_4)
実行結果

様々な「アンパック」の方法(準備する変数が不足した場合)
アンパックを行うとき、準備する変数が不足するとエラーとなります。
# パックを行っています。
packDate1 = 1, 2, 3, 4, 5
# アンパックを行う場面ですが、受け取り側の変数が足りずエラーとなります。
data1_1,data1_4, = packDate1
print(data1_1, "/", data1_4)
実行結果

様々な「アンパック」の方法(アスタリスクの利用)
アンパックで変数にアスタリスクを付けると、複数の値をリストで取得することができます。但し、アスタリスクを利用できる箇所はひとつだけです。
下のプログラムでは5つの値をもつタプルを3つの変数で受け取っています。この時、受け取る変数の何れかひとつにアスタリスクを付けて取得します。
# パックを行っています。
packDate1 = 1, 2, 3, 4, 5
# アスタリスクを利用してアンパックを行っています。
# 最初の変数にアスタリスクを利用。
*data1_1, data1_2, data1_3 = packDate1
print("最初の変数にアスタリスクを利用。")
print(data1_1, "/", data1_2, "/", data1_3)
# アスタリスクを利用してアンパックを行っています。
# 真ん中の変数にアスタリスクを利用。
data1_1, *data1_2, data1_3 = packDate1
print("真ん中の変数にアスタリスクを利用。")
print(data1_1, "/", data1_2, "/", data1_3)
# アスタリスクを利用してアンパックを行っています。
# 最後の変数にアスタリスクを利用。
data1_1, data1_2, *data1_3 = packDate1
print("最後の変数にアスタリスクを利用。")
print(data1_1, "/", data1_2, "/", data1_3)
実行結果

様々な「アンパック」の方法(アスタリスクの複数利用)
アンパックで変数にアスタリスクを付けると、複数の値をリストで取得することができます。但し、アスタリスクを利用できる箇所はひとつだけです。複数利用するとエラーとなります。
# パックを行っています。
packDate1 = 1, 2, 3, 4, 5
# アスタリスクを利用してアンパックを行っています。
# アスタリスクを複数の箇所で利用するとエラーとなります。
*data1_1, data1_2, *data1_3 = packDate1
今回は以上になります。

ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

