見出し画像

小学生でも分かる!Pythonプログラミング - (tuple) / unpack_assign

← preview

next →


< class 'tuple' >

calendar.

>> tuple = タプル / 組

〔 tuple ( タプル ) 〕

「 tuple(タプル) 」とは、
後から要素の値を変更できないリストのことです。

リストとの違いは、まずその見た目にあります。

● list型のオブジェクト
[ v1, v2, v3 ]

● tuple型のオブジェクト
 ( v1, v2, v3 )

リストが記号「 [  ] 」を使うのに対して、
タプルは記号「 (  ) 」を使います。

試しにtype関数を使って
オブジェクトの型を調べてみましょう。

tuple_name = (v1, v2, v3...)

「 < class 'tuple' > 」という
専用のが存在するのですね。

タプルをどんな時に使うかですけれど、
例えば「曜日」のように
何かの拍子に順番や内容を変えてしまったら
困る時に使われますね。

ちなみにタプルはリストに比べて
実行速度が微妙に速いそうです。

タプルは後々ちょいちょい出てくるので覚えましょう。


リストの「 [ ブラケット ] 」と違って
タプルの「 ( 括弧 ) 」は省略することができます

何気に大切なことかもしれない。

abc_tuple = ( "a", "b", "c" )

abc_tuple = "a", "b", "c"

このようにしても型は変わらないし
挙動も変わりません。

その事を知った上で、
注意してほしいことがあります。

リストの場合は、[ブラケット]を書いた時点で
1つのオブジェクトとして認識されましたよね。
だから「 a = [ ] 」と書いてもエラーにならない。

同じようにタプルも、「 a = ( ) 」のように
空のタプルを書いてもエラーになりません

空のタプルは、「 tuple型のオブジェクト 」
として認識されています

空のリスト、空のタプル

しかし!!!
値を1つ入れてみると...

< class 'list' >
< class 'int' > ????????

なぜかタプルの方だけ「 <class 'tuple'> 」ではなく
「 < class 'int' > 」と判断されています。

なんで???????


理由はこう考えられます。

空のリスト空のタプルを用意するのはなぜですか?

「 後から値を追加するため 」のことが大半ですよね。
空のまま使う事って無いに等しいんじゃないだろうか。

「 a = ( ) 」

👆この時点では、
具体的な値が ( ) 」以外ないから
「 空のタプル 」って思うかもしれない。

しかし、

「 a = 1+1 * 2 」

👆このように「 ( ) 」が
タプルとして使われない事も想定されます

この場合、aに代入されているのは
int型のオブジェクト
になります。

つまり、 ( ) 内に
「 具体的な値 」が入ってしまったら、

「 カンマ( , ) 」で区切られるまでは
「 タプルだ 」と断定することができない

ってことですよね?

だから単純に( )内の
オブジェクトの型(int型)
を返してきたのです。

値をカンマ( , )で区切った時点で タプル と確定するのだなあ。


予期しないエラーが起こった時、
もしかしたら値をカンマで区切っていない事が
原因になっているかもしれません。
ちゃんと覚えておきましょう。


>> index[n] = tuple型オブジェクトの値の取り出し

タプルの値の取り出し方は、リストと同じです。

分かんない人は前回の記事を読むべし!!

以上!!!!!!!

散!!!!!!!!

index(n)ではなく、index[n]。
完全にリストと同じ。助かる。



>> index[n] = "x" ( リスト/タプルの値の変更 )

タプルとは、後から値を変更できないリスト
という説明をしました。

本当に後から値を変更できないの?
情報を鵜呑みにせず実際にやってみましょう。


● リストの値を後から変更してみよう。

ちゃんと変えられた。

元々は「 abc[0] = "a" 」ですね。
そこで「 abc[0] = "あ" 」と書くことで
再び値を代入して情報を更新できます。

これがリストの値の変更です。


● タプルの値を後から変更してみよう。

TypeError.

再代入しようとしたら
エラーになってしまいました。

エラーメッセージは、

'''
TypeError : 'tuple' object does not support 
item assignment

''''

です。

「 tuple(型)オブジェクトは、
項目の代入をサポートしてまへん。 


という趣旨のエラーです。

簡単に言えば「値を変更できまへん
という意味ですよね。

本当に変更できなかった。

しかし、そのうち記事にしますが
タプルでも値を削除したり追加したりする方法はあります。

今は「タプルは後から値を変えられない
という事実だけを胸に抱いて生きてください。


>> unpack_assign = アンパック代入

open!

〔 unpack ( アンパック ) 〕

リストやタプルに格納されている要素たちを、
要素と同じ数の変数に1つ1つ代入することができます。


これを「アンパック代入」と言います。

今後当たり前のように出てくるので、
しっかり覚えましょう。

data[0] を「a」
data[1] を「b」
data[2] を「c」
代入しておる

大切なのは、
リストの要素と同じ数の変数を用意してやることです。
そうしないとエラーになってしまいます。

●  要素数が多い(変数が少ない)

● 要素数が少ない(変数が多い)


これまで学んだ事と、アンパック代入を利用して
こんな事ができますね。👇

str( input( ) ) を活かして、
ユーザーが入力したデータをstr型に変換して
自動的にリストに格納してやることができます。

>> Challenge_Quiz

覚えたことを活かしてみましょう。

外部からデータを取り込んだときなど、
リストの要素数が意図せず
多くなってしまうことが想定されますよね。

例えば...

data = [ "2022-10-09", "Sun", "20:45:34", 
"Japan", "Tokyo", "Shibuya", "123456789", 
"iPhone20Pro", "Tsukigami", "Light" ]


こんな長めのリストがあったとしましょう。

リストの中の特定の値しか使わない
という時もあるのではないでしょうか。

そんな時にアンパック代入を使うために
全ての要素分の変数作るのは非効率的です。

どうしますか?という問題です。

実際にやってみましょう。

👆リスト「 data 」から値を3つ選んで、
その3つの値だけを変数に代入して
コンソール出力してみて下さい。


変数名などは自由に決めて構いません。


解答例

a, b, c = index[1], index[3], index[5] 

変数への値の代入は、

変数① = 値①
変数② = 値②
変数③ = 値③

このように、
行を分ける書き方をしても構いません。

しかし、せっかくアンパック代入
複数の変数複数の値を代入する方法を学んだので、

変数①, 変数②, 変数③ = 値①, 値②, 値③

こんな風に1行にまとめて書いてみましょう。

また、ラストネームの「 "Tsukigami" 」と
ファーストネームの「 "Light" 」を繋げて
フルネームを出力したいなと思いました。

そのため、
「 full_name = data[8] + "_" + data[9] 」
という記述になっています。

全てstr型のオブジェクトなので、
「+」を使って繋げても問題ありません。

もし、リストの値が
str型のオブジェクトではなかったら

「 full_name = str( data[8] ) + "_" + str( data[9] ) 」

と書けば良いですね。


次の記事へ。

この記事が気に入ったらサポートをしてみませんか?