![見出し画像](https://assets.st-note.com/production/uploads/images/88649197/rectangle_large_type_2_11b0b6ac3994447775f115d10ff3e1df.png?width=1200)
小学生でも分かる!Pythonプログラミング - (tuple) / unpack_assign
← preview
next →
< class 'tuple' >
![](https://assets.st-note.com/production/uploads/images/88647593/picture_pc_dfda9cd4ca88150b258ba113cf3f1fa6.png?width=1200)
>> tuple = タプル / 組
〔 tuple ( タプル ) 〕
「 tuple(タプル) 」とは、
後から要素の値を変更できないリストのことです。
リストとの違いは、まずその見た目にあります。
● list型のオブジェクト
[ v1, v2, v3 ]
● tuple型のオブジェクト
( v1, v2, v3 )
リストが記号「 [ ] 」を使うのに対して、
タプルは記号「 ( ) 」を使います。
試しにtype関数を使って
オブジェクトの型を調べてみましょう。
![](https://assets.st-note.com/production/uploads/images/88542082/picture_pc_256e71bd22212a250f7c57af7f113a95.png?width=1200)
「 < class 'tuple' > 」という
専用の型が存在するのですね。
タプルをどんな時に使うかですけれど、
例えば「曜日」のように
何かの拍子に順番や内容を変えてしまったら
困る時に使われますね。
ちなみにタプルはリストに比べて
実行速度が微妙に速いそうです。
タプルは後々ちょいちょい出てくるので覚えましょう。
リストの「 [ ブラケット ] 」と違って
タプルの「 ( 括弧 ) 」は省略することができます。
何気に大切なことかもしれない。
abc_tuple = ( "a", "b", "c" )
↓
abc_tuple = "a", "b", "c"
このようにしても型は変わらないし
挙動も変わりません。
その事を知った上で、
注意してほしいことがあります。
リストの場合は、[ブラケット]を書いた時点で
1つのオブジェクトとして認識されましたよね。
だから「 a = [ ] 」と書いてもエラーにならない。
同じようにタプルも、「 a = ( ) 」のように
空のタプルを書いてもエラーになりません。
空のタプルは、「 tuple型のオブジェクト 」
として認識されています。
![](https://assets.st-note.com/production/uploads/images/88548866/picture_pc_8630745ff88c35b7de1d52815ff37a45.png?width=1200)
しかし!!!
値を1つ入れてみると...
![](https://assets.st-note.com/production/uploads/images/88548687/picture_pc_b34c7ce17bdc80b51cc6c0fdec0306af.png?width=1200)
![](https://assets.st-note.com/production/uploads/images/88548694/picture_pc_244a8083383f2f22bb5decf6e835a278.png?width=1200)
なぜかタプルの方だけ「 <class 'tuple'> 」ではなく
「 < class 'int' > 」と判断されています。
なんで???????
理由はこう考えられます。
空のリストや空のタプルを用意するのはなぜですか?
「 後から値を追加するため 」のことが大半ですよね。
空のまま使う事って無いに等しいんじゃないだろうか。
「 a = ( ) 」
👆この時点では、
具体的な値が「 ( ) 」以外ないから
「 空のタプルだ 」って思うかもしれない。
しかし、
「 a = ( 1+1 ) * 2 」
👆このように「 ( ) 」が
タプルとして使われない事も想定されます。
この場合、aに代入されているのは
int型のオブジェクトになります。
![](https://assets.st-note.com/production/uploads/images/88640972/picture_pc_71ee1e88d748fe5e04a6c0fa7d1ff4eb.png?width=1200)
つまり、 ( ) 内に
「 具体的な値 」が入ってしまったら、
「 カンマ( , ) 」で区切られるまでは
「 タプルだ 」と断定することができない
ってことですよね?
だから単純に( )内の
オブジェクトの型(int型)を返してきたのです。
![](https://assets.st-note.com/production/uploads/images/88547944/picture_pc_e5d8003cdae15ad0b28128073f8c6d3b.png?width=1200)
予期しないエラーが起こった時、
もしかしたら値をカンマで区切っていない事が
原因になっているかもしれません。
ちゃんと覚えておきましょう。
>> index[n] = tuple型オブジェクトの値の取り出し
タプルの値の取り出し方は、リストと同じです。
分かんない人は前回の記事を読むべし!!
以上!!!!!!!
散!!!!!!!!
![](https://assets.st-note.com/production/uploads/images/88543655/picture_pc_28e96a680096c894a80f631bf9e05edb.png?width=1200)
完全にリストと同じ。助かる。
>> index[n] = "x" ( リスト/タプルの値の変更 )
タプルとは、後から値を変更できないリスト
という説明をしました。
本当に後から値を変更できないの?
情報を鵜呑みにせず実際にやってみましょう。
● リストの値を後から変更してみよう。
![](https://assets.st-note.com/production/uploads/images/88642770/picture_pc_36537cc2ce4a8e9fdacd8f38684b7062.png?width=1200)
元々は「 abc[0] = "a" 」ですね。
そこで「 abc[0] = "あ" 」と書くことで
再び値を代入して情報を更新できます。
これがリストの値の変更です。
● タプルの値を後から変更してみよう。
![](https://assets.st-note.com/production/uploads/images/88643948/picture_pc_351351a3775c25d4d8148ccfc1fbc216.png?width=1200)
再代入しようとしたら
エラーになってしまいました。
エラーメッセージは、
'''
TypeError : 'tuple' object does not support
item assignment
''''
です。
「 tuple(型)オブジェクトは、
項目の代入をサポートしてまへん。 」
という趣旨のエラーです。
簡単に言えば「値を変更できまへん」
という意味ですよね。
本当に変更できなかった。
しかし、そのうち記事にしますが
タプルでも値を削除したり追加したりする方法はあります。
今は「タプルは後から値を変えられない」
という事実だけを胸に抱いて生きてください。
>> unpack_assign = アンパック代入
![](https://assets.st-note.com/production/uploads/images/88551664/picture_pc_f2a583b3b4617571640aa72999cd71f4.png?width=1200)
〔 unpack ( アンパック ) 〕
リストやタプルに格納されている要素たちを、
要素と同じ数の変数に1つ1つ代入することができます。
これを「アンパック代入」と言います。
今後当たり前のように出てくるので、
しっかり覚えましょう。
![](https://assets.st-note.com/production/uploads/images/88552586/picture_pc_b7af9a15701876f5c044bbde084b3790.png?width=1200)
data[1] を「b」に
data[2] を「c」に
代入しておる
大切なのは、
リストの要素と同じ数の変数を用意してやることです。
そうしないとエラーになってしまいます。
● 要素数が多い(変数が少ない)
![](https://assets.st-note.com/production/uploads/images/88645528/picture_pc_2720f52d17348791ac249481b4b77e6b.png?width=1200)
● 要素数が少ない(変数が多い)
![](https://assets.st-note.com/production/uploads/images/88645594/picture_pc_c141d8f60dc75803715d7aa8edc533bd.png?width=1200)
これまで学んだ事と、アンパック代入を利用して
こんな事ができますね。👇
![](https://assets.st-note.com/production/uploads/images/88630775/picture_pc_694bd1ab098e05c69972b7b9b06669af.png?width=1200)
ユーザーが入力したデータをstr型に変換して
自動的にリストに格納してやることができます。
>> Challenge_Quiz
覚えたことを活かしてみましょう。
外部からデータを取り込んだときなど、
リストの要素数が意図せず
多くなってしまうことが想定されますよね。
例えば...
data = [ "2022-10-09", "Sun", "20:45:34",
"Japan", "Tokyo", "Shibuya", "123456789",
"iPhone20Pro", "Tsukigami", "Light" ]
こんな長めのリストがあったとしましょう。
リストの中の特定の値しか使わない
という時もあるのではないでしょうか。
そんな時にアンパック代入を使うために
全ての要素分の変数作るのは非効率的です。
どうしますか?という問題です。
実際にやってみましょう。
👆リスト「 data 」から値を3つ選んで、
その3つの値だけを変数に代入して
コンソール出力してみて下さい。
変数名などは自由に決めて構いません。
解答例
![](https://assets.st-note.com/production/uploads/images/88634268/picture_pc_a3a776aaa858bc6c66111ab4b477231a.png?width=1200)
変数への値の代入は、
変数① = 値①
変数② = 値②
変数③ = 値③
このように、
行を分ける書き方をしても構いません。
しかし、せっかくアンパック代入で
複数の変数に複数の値を代入する方法を学んだので、
変数①, 変数②, 変数③ = 値①, 値②, 値③
こんな風に1行にまとめて書いてみましょう。
また、ラストネームの「 "Tsukigami" 」と
ファーストネームの「 "Light" 」を繋げて
フルネームを出力したいなと思いました。
そのため、
「 full_name = data[8] + "_" + data[9] 」
という記述になっています。
全てstr型のオブジェクトなので、
「+」を使って繋げても問題ありません。
もし、リストの値が
str型のオブジェクトではなかったら
「 full_name = str( data[8] ) + "_" + str( data[9] ) 」
と書けば良いですね。
次の記事へ。
この記事が気に入ったらサポートをしてみませんか?