『Python入門』タプルってなに?特徴と使い方を解説

Python プログラミング Python

タプルはリストに続いて利用されるコンテナの1つであり、リストと使い方が似ています。そんなリストとの違いやタプルの特性を解説していきます。ここではインタラクティブシェルを使ってプログラムの例を挙げていきます。

タプルとは

タプルとは、複数の異なる型のオブジェクトを格納することができるデータ構造で、イミュータブルなシーケンス型のコンテナの1つになります。

以下は、イミュータブル、シーケンス型、コンテナについて簡単に説明します、不要な場合は読み飛ばしてください。

 

イミュータブルとは

イミュータブルとは、変更ができないオブジェクトの性質のことを言い、要素の変更、追加、削除ができません。

「要素の変更」につてもう少し詳しく説明すると、要素にはオブジェクト自体では無く、オブジェクトに関連付いたオブジェクトIDが格納されています。なのでこのオブジェクトIDが変更されなければ良いということになります。

つまり、オブジェクトIDがミュータブルなリストのオブジェクトなどと関連付けられていた場合は、そのリストの要素は変更することが出来ます。

 イミュータブルとは逆で、変更ができるオブジェクトの性質をミュータブルと言います。

 

シーケンス型とは

コンテナに格納されたオブジェクトを要素と呼び、それぞれの要素にはインデックスが0から順番に割り振られ、インデックスを指定することでそのインデックスに割り当てられた要素を参照することが出来ます。このように順番を持つコンテナのことをシーケンス型(シーケンシャル)なオブジェクトと言います。

 

イテラブルとは

イテラブルとは、要素を1つずつ返す機能を持つオブジェクトのことで、for文でループさせながら要素を順に取得することができます。シーケンス型の全てはイテラブルであり、タプルもシーケンス型になるのでイテラブルなオブジェクトとなります。

 

コンテナ(コレクション)とは

ここで言うコンテナとは、オブジェクトの集まりを表現するデータ構造の総称で、コレクションとも呼ばれます。コレクションには タプルの他に、リストや辞書、セットなどがあります。

 

タプルを作成する構文

タプルの作成には以下の2種類の構文が存在します。

[構文1] 値1, 値2, ...
[構文2] (値1, 値2, ...)

 

[構文1] 値1, 値2, ...

いくつかの値をカンマで区切って記述することで、変数への代入はタプルとして認識されます。

Python tuple no02

上記は、タプルのオブジェクトを作成しています。

①「構文1」でタプルのオブジェクトを作成し、オブジェクトを変数tpへ代入。②変数tpに代入したオブジェクトの内容を出力。③type関数で変数tpに代入されたオブジェクトの型を出力しています。

①を見るとタプルの要素には異なる型のオブジェクを保存できることがわかります。

 

[構文2] (値1, 値2, ...)

タプルであることを明示的に現したい場合は、値を括弧で囲んで記述します。

Python tuple no02

上記は、タプルのオブジェクトを作成しています。

①「構文2」でタプルのオブジェクトを作成し、オブジェクトを変数tpへ代入。②変数tpに代入したオブジェクトの内容を出力。③type関数で変数tpに代入されたオブジェクトの型を出力しています。

 

タプルの値を取得

タプルはシーケンス型のオブジェクトになります。なのでインデックスを指定して各要素に保存された値を取得することができます。インデックスは始まりを0として1ずつ増えていきます。3つのデータを格納したタプルの場合は0,1,2とインデックスを指定することで3つのデータを取得できます。

[構文] タプル[インデックス]

 

Python tuple no03

上記は、①3つのデータを格納したタプルを作成し変数tpに保存し、②変数tpの内容を出力しています。③インデックス番号の0を指定して変数tpの1つ目の要素の値を出力しています。④インデックス番号の1を指定して変数tpの2つ目の要素の値を出力しています。⑤同じく、インデックス番号の2を指定して変数tpの3つ目の要素の値を出力しています。

 

イミュータブルなタプルの要素の変更はできない

タプルはイミュータブルなオブジェクトになるので要素を変更する事はできません

Python tuple no04

上記では、1つ目の要素の値を1から10に変更しようとしたところ、「タプルオブジェクトでは要素への割当てをサポートしないよ」エラーが発生し、要素の変更ができないことがわかります。

 

タプルの要素がミュータブルな場合の変更

イミュータブルなオブジェクトは要素を変更できないと言いましたが、要素がミュータブルなリストなどであればリストの要素自体を変更することはできる
それは、イミュータブルなタプルオブジェクトの要素に格納されたオブジェクトIDは変更されないためです。

Python tuple no05

上記は、タプルの要素にリストを保持している場合に、要素であるリストが保持する要素を変更できることを確認しています。①と②では「id関数」でタプルオブジェクトを代入した変数tpの3つ目の要素のIDを確認のために出力しています。リストオブジェクトの要素の値をを変更した前後でIDが「4562520712」で同じことがわかります。

 

タプルの加算

タプルは 「+演算」を使って2つのタプルを1つにまとめることが出来ます。
「+演算」の左辺のタプルの後ろに右辺のタプルを追加します。

タプルはイミュータブルなオブジェクトなのに加算できるの?っと疑問に思いますよね。それは正確には加算しているのでは無く、オブジェクトを新たに作成しているためです。

変数に代入したタプルのオブジェクトIDを変更前と変更後で確認するとオブジェクトIDが異なることがわかります。

Python tuple no06

上記は、①で「+演算子」の左辺のオブジェクトに右辺のオブジェクトを加えたオブジェクトを作成して変数tpに代入しています。その時のI Dをid関数で確認すると「4575925096」になります。②では①で作成したオブジェクトに更に「+演算子」の右辺のオブジェクトを加えたオブジェクトを作成して変数tpに代入しています。この時のIDをid関数で確認すると「4576002696」に変わっていることがわかります。これは、元のオブジェクトの内容が変更されているのでは無く、新しく作成された別のオブジェクトが変数に代入されていることになります。

 

タプルの乗算

タプルは 「*演算子」を使ってタプルを整数で指定した数だけ繰り返してつなげることが出来ます。

「*演算」の左辺のタプルの後ろに指定した数だけ右辺のタプルを繰り返しつなげます。

タプルはイミュータブルなオブジェクトなのに乗算がでるのは可算の時と同じでオブジェクトを新たに作成しているためです。

乗算を行う前と後でid関数で確認するとIDが変わっていることがわかります。(加算で確認しているので、そちらを参考にしてください。)

Python tuple no07

上記は、「*演算子」を使った乗算の例になります。①タプルを2倍しているので、(100, 200)+(100, 200)と同じ結果になります。②こちらも2倍になるので(100, 200, 100, 200) + (100, 200, 100, 200)と同じ結果になります。

 

タプルのシーケンス演算

シーケンス型のコンテナであるタプルでは、シーケンス演算と呼ばれる演算を利用できます。

 

値があるかを調べる

タプルの中に指定した値が含まれているかを調べます。「in演算子」は含まれていていればTrue「not in演算子」は含まれていたらFalseを返します。左辺に調べたい値を記述して、右側に確認対象のタプルを記述します。

[構文] 値 in タプル
[構文] 値 not in タプル

 

Python tuple no08

上記は、変数tpに1,5,10の値を要素に持つタプルを代入しています。

右辺のタプルの要素に左辺の数値の2が含まれているかを「in演算子」で評価した結果、含まれていないのでFalseを返します。②タプルの要素に数値の5が含まれているかを「in演算子」で評価した結果、含まれているのでTrueを返します。

右辺のタプルの要素に左辺の数値の2が含まれているかを「not in演算子」で評価した結果、含まれていないのでTrueを返します。④タプルの要素に数値の5が含まれているかを「not in演算子」で評価した結果、含まれているのでFalseを返します。

 

指定した範囲の値を取り出す

タプルの中から指定した範囲の要素を持つタプルを返します。
開始位置はインデックスを指定し、終了位置はインデックス+1で指定します。

[構文] タプル[開始位置:終了位置]

 

Python tuple no09

上記の場合、①[1:4]の左の1が「インデックス」になります。右の4が「4個目の要素」を指します。インデックスは0から始まるので、「2つ目の要素から4個目の要素」までのタプルオブジェクトを作成して変数tp2に代入しています。

 

要素数を取得する

「len関数」の引数に タプルを指定することで、タプルの要素数を返します。

[構文] len(タプル)

 

Python tuple no10

上記は、5つの要素を持つタプルを「len関数」の引数に指定したため、戻り値として5が返ります。

 

最小値、最大値を取得する

タプルの要素の内、最大値と最小値を返し関数があり、最大値は「max関数」、最初うちは「min関数」を使います。

タプルは異なる型のオブジェクトを格納できるのですが、最小値、最大値を取得する場合は要素は同じ型のオブジェクトである必要があります。

[構文] max(タプル)
[構文] min(タプル)

 

Python tuple no11

上記は、要素が整数値のタプルの最大値と最小値を出力しています。

 

Python tuple no12

上記は、要素が文字列のタプルの最大値と最小値を出力しています。アルファベットはa-zA-Zの順になるので”d”が一番大きくなります。最小値は“A”になります。

「ord関数」の引数に”a”と”A”を渡した場合に”a”は97、”A”は65で”A”の方が小さいことがわかります。この数字はASCIIコードといい、ASCIIコードの値で大小が決まります

 

異なるオブジェクトを要素に持つ場合はエラーになります。

Python tuple no13

「文字列と数値の間で大小の比較はサポートしていない」エラーが発生します。

 

シーケンス間の変換

シーケンス型のオブジェクトにはリスト、タプル、レンジがあります。これらはインデックスで要素を管理し、インデックスで要素を取り出します。

これらは似た使い方ができますが、異なる型のオブジェクトを+演算で1つにまとめることはできませんこうした演算が必要な場合は、同じ型に変換することで可能になります

正確に言うと、変換というよりはオブジェクトを新規作成になります。

 

リストに変換

異なるオブジェクトを「list関数」を使って、リストオブジェクトに変換することができます。正確に言うとリストオブジェクトを新たに作成しています。

[構文] list(タプルまたはレンジオブジェクト)

 

Python tuple no14

 

タプルに変換

異なるオブジェクトを「tuple関数」を使って、タプルオブジェクトに変換することができます。正確に言うと タプルオブジェクトを新たに作成しています。

[構文] tuple(リストまたはレンジオブジェクト)

 

Python tuple no15

 

レンジに変換

リスト、タプルからレンジへの変換は同じシーケンス型のオブジェクトですができません。レンジオブジェクトの作成に使う「range関数」の引数が特殊なためです。

以下の構文1と2を見て分かるとおり、「range関数」の引数にはオブジェクトを渡すのでは無く、インデックスとして数値を渡しています。

[構文1] range(終了インデックス)
[構文2] range(開始インデックス、終了インデックス[、ステップ])

 

Python tuple no17

上記は、「range関数」の引数にリストオブジェクトを渡した場合に「リストオブジェクトは整数として解釈できない」エラーが発生することがわかります。

range関数については以下の記事が参考になります。

『Python入門』for文とin演算子でrangeオブジェクトを操ろう
ここではfor文のループに使うrangeについての解説と、使い方を簡単なコードを通して解説していきます。

 

タプルの使いどころ

1. 定数として固定な変数の集まりを定義したい場合。

 変数への再代入をしない限りオブジェクトの値は変更されない。

2. リストよりパフォーマンスが良い。

 シビアではありますがパフォーマンスを少しでも向上させたい場合はタプルを利用するのも手です。

 

タイトルとURLをコピーしました