python tuple アンパッキング

Python学習【365日チャレンジ!】20日目のマスターU(@Udemy11)です。

タプル型のアンパッキングという言葉はもちろんはじめて聞いたのですが、今回のチャプターを受講してみて、

あ〜〜ん、そういうことね

とすこし理解したつもりに。

ようするに、タプルに定義することがパッキングで、タプルから取り出して文字列などにするのがアンパッキングということですね。
(間違っていたら、教えて下さい。)

この解釈が正しかろうが間違っていようが、勝手解釈ですすめていきますが、とくに問題はないような気がします。

重要なのは、どんどん手を動かすことだと思っているので、復習しながらしっかりと新しいことを頭に入れていきますよ〜!

昨日の復習

昨日はタプルの基本を学びました。
parenthesesの丸括弧がなくても,(カンマ)で区切ればタプル型になることやリストと同じようにスライスなどができました。

タプルの基本

  • ()でくくるか、,(カンマ)でつなげる
  • リストと同じように扱える
  • 値を変更することはできない
  • タプルの中にリストを入れることが可能

実際のコードをみていきましょう。

>>> a = (1, 2, 3)
>>> b = 1, 2, 3
>>> type(a)
<class 'tuple'>
>>> type(b)
<class 'tuple'>

()でも,(カンマ)でもタイプはタプル型になります。

>>> a = (1, 2, 3, 4, 1)
>>> a[0]
1
>>> a[1:4]
(2, 3, 4)
>>> a.index(1)
0
>>> a.count(1)
2

使えるメソッドは限られますが、リストと同じように、indexの位置の値を検索したり、スライスしたり、指定の値を抽出したり、カウントしたりできます。

リストと大きく違うのが、タプルの中の値は変更することができないところです。

ただ、タプルの中にリストを入れることができて、そのリストの中身は変更することが可能です。

>>> t = ([2, 4, 6], [1, 3, 5])
>>> t[0][0] = 100
>>> t
([100, 4, 6], [1, 3, 5])

このあたりのルールは重要なので、しっかりと復習が必要です。

それでは、本日学習した内容に入ります。

タプルの中から値を取り出す

タプルの値は変更できないということがわかりました。
その変更できないタプルの値を取り出して別々の変数に代入することができます。

new_tuple = (10, 20)
print(new_tuple)
 
x, y = new_tuple
Printi(x, y)

出力結果

(10, 20)
10 20

あまり多くなると見づらい

タプルを代入した変数を切り分けていましたが、2つ程度の値だけ格納されているタプルのアンパッキングなら見た目もスッキリしますが、タプルの中に格納されている値が多いと逆に見づらくなるので、個別に代入したほうがコード的にスッキリするようです。

a, b, c, d, e, f = ('1', '2', '3', '4', '5', '6')
print(a, b, c, d, e, f)
a = '1'
b = '2'
c = '3'
d = '4'
e = '5'
f = '6'
print(a, b, c, d, e, f)

出力結果

1 2 3 4 5 6
1 2 3 4 5 6

行数が増えますが、1列で記載すると、どの値がどの変数と対比しているのかわからなくなってしまうので、個別に代入したほうがコード的にはわかりやすいようです。

タプルを使って値を入れ替える

変数に値を代入したあと、変数の値を入れ替えたいときにタプルを使えばかんたんに入れ替えることができます。

i = 10
j = 20
temp = i
i = j
j = temp
print(i, j)
 
i, j = (j, i)
print(i, j)

出力結果

20 10
10 20

タプルを使わず、変数tempを使うことで、変数iの値と変数jの値を入れ替えると、上記の様な3行のコードになります。

一方で、タプルを使えば、1行で入れ替えることが可能です。

元のタプルは変更されない

リストの場合は、参照渡しというものがあって、新しい変数にすでに定義された変数のリストを指定して値を変更すると、元の変数の値も変わってしまいました。

>>> a = [1, 2, 3]
>>> b = a
>>> b[0] = 100
>>> b
[100, 2, 3]
>>> a
[100, 2, 3]

しかし、タプルの場合は、元の変数の中身を変更することはできませんし、アンパッキングで切り分けた変数を変更したとしても元の変数はそのままです。

>>> a = (1, 2, 3)
>>> x, y, z = a
>>> x
1
>>> x = 100
>>> a
(1, 2, 3)
>>> x
100
>>> y
2
>>> z
3

変数aを変更しているわけじゃないので、当たり前といえば当たり前なんですが、

そういうことか!

という気づきを感じながら、学習することで理解が深まっていくように感じています。

さあ、明日はどんな気付きが待ってるのかな?

ではでは、Good Python!