今回はタプルでよく使うパックやアンパックについて紹介したいと思います。
パックやアンパックを理解していると、
- 複数の代入操作を一行で記述できる
- コードがシンプルになる
というメリットがあります。
一度覚えてしまえば簡単な話なので、ぜひ習得しましょう!
動画で解説|タプルのパックとアンパック
5min. Python解説動画【入門編】|第12回:タプルパッキングとアンパック
タプルとは?|リストとの違いは?
タプルはシーケンス型の一つで、リスト同様に複数のデータの並びを取り扱うときに使用します。
リストとタプルには:
- リスト:後から要素の書き換えが可能(ミュータブル)
- タプル:後から要素の書き換えが不可能(イミュータブル)
という違いがありますが、その他の点は、共通している部分が多いので、基本操作についてはこちらの記事をご覧ください。
タプル生成の基本
タプルを生成するには、
()
で囲う- 要素を
,
で区切って入力
というのが基本となります。
t = ("A", "B", "C")
print(t)
# ('A', 'B', 'C')
要素には複数の型が含まれていても構いません。
t = ("A", 100)
print(t)
# ('A', 100)
どちらかというと、
- リスト:同じ型の要素で生成することが多め
- タプル:異なる型の要素で生成することも結構ある
という印象があります。
要素が一つのタプルを作成する場合には、
()
で囲う- 末尾に
,
を追加
で作成できます。
t = ("A",)
print(t)
# ('A',)
タプルパッキング|変数をタプルにまとめる!
タプルを生成するときに()
を省略することができます。
複数の変数が1つのタプルにまとめられる(パッキングされる)ので、タプルパッキングといいます。
- 右辺に複数の変数を
,
で区切って並べる - 左辺の変数に代入する
t = "A", 100
print(t)
# ('A', 100)
要素が1つのタプルを生成する際にも、 ()
を省略してタプルパッキングできます。
t = "A",
print(t)
# ('A',)
たまに、この表記を見ますが、理解していないと、この,
いる?!となってしまいますね。
ただ()
を省略しただけですが、タプルパッキングと呼んだ方がかっこいいです。
アンパック|タプルを複数の変数に展開!
タプルを変数に代入する際に、タプルを展開(アンパック)して、複数の変数に1要素ずつ渡すことができます。
タプルをアンパックするには、
- 右辺にタプル
- 左辺に要素の数だけ変数
を書きます。
t = (100, "A")
score, grade = t
print(f"Your grade is {grade} as your score is {score}")
# Your grade is A as your score is 100
アンパックはリストでも行えます。
t = [100, "A"]
score, grade = t
print(f"Your grade is {grade} as your score is {score}")
# Your grade is A as your score is 100
_で受ける
アンパックするときに、後から使用しない要素は_
で受けるという慣例があります。
t = (100, "A", "Trivial info")
score, grade, _ = t
print(f"Your grade is {grade} as your score is {score}")
# Your grade is A as your score is 100
_
が特別な機能を持つわけではないですが、後から見た人が_
は不要な値なんだなと簡単にわかります。
*変数名で受ける
アンパックする際に、変数の数とタプルの数が一致しないと普通はエラーになります。
t = (100, "A", "Trivial info", "Trivial info2")
score, grade, _ = t
# ValueError: too many values to unpack (expected 3)
変数の数≦要素数
の場合には、代入先の変数が足りなくて要素が余ってしまいます。
このとき*変数名
とすると余った要素を1つのリストにまとめて受けることができます。
t = (100, "A", "Trivial info", "Trivial info2")
score, grade, *_ = t
print(f"Your grade is {grade} as your score is {score}")
# Your grade is A as your score is 100 <br />
print( type(_), _ )
# <class 'list'> ['Trivial info', 'Trivial info2']
この例でもわかる通り、*変数名
はリストになります。
*変数
の位置は始めでも、途中でも構いません。
- *が付いていない変数に優先して代入される
- 余った要素が
*変数名
に代入される
というプロセスになっています。
t = (100, "A", "Trivial info", "Trivial info2")
*_, info_1, info_2 = t
print(info_1, info_2)
# Trivial info Trivial info2
*変数
が2個以上あると要素をどう分配して良いかわからないので、*変数は一行で1回までしか使えません。
パックとアンパックの応用
複数の値を複数の変数に代入する際には、次のように書けます。
name, score, grade = "YutaKa", 100, "A"
print(f"{name}'s grade is {grade} as {name}'s score is {score}")
# YutaKa's grade is A as YutaKa's score is 100
これは細かく見ると、
- 右辺の値がタプルにパックされる
- 左辺に代入する際にタプルがアンパックされる
というパックとアンパックを応用した代入方法です。
わかりやすく、間にタプルの変数を挟むとこうなります。
# タプルパッキング
t = "YutaKa", 100, "A"
#タプルのアンパック
name, score, grade = t
print(f"{name}'s grade is {grade} as {name}'s score is {score}")
# YutaKa's grade is A as YutaKa's score is 100
複数の変数への代入を1行で書くと、コードが見やすくなる場合がありますよね!
(多用しすぎると見にくくなるので注意しましょう!10個とか一行で代入すると見づらいかも…。)
おわりに
今回はタプルのパック・アンパックについて紹介しました!
5min. python動画解説では、pythonの基本をショートクリップで解説しています!
流し見するだけでpythonをマスターできる動画シリーズを目指しています。