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