Python

【Python初心者】タプル型を学ぼう!

こんにちは(@t_kun_kamakiri)(‘◇’)ゞ

この記事ではPythonのデータの型の中の「タプル型」について解説します。

まずデータの型についてですが、以下の種類があります。

  • 数値型
    • 整数
    • 浮動小数点
    • 複素数
  • 文字列
  • リスト型
  • 辞書型(ハッシュ)
  • タプル型
  • 集合型
  • 論理型

これらすべて完璧に使い方を覚える必要はないと思いますので、この記事では「これくらいは覚えておこう」というものをまとめておきます。

その中でも本記事では「タプル型」について解説します。

基本的なことをまとめておきました。

この記事の内容
  1. Pythonのタプル型とは?
  2. タプル型とリスト型との違い
  3. 要素の要素の取り出し
  4. その他リスト型の関数とメソッド

 

使用環境を示しておかないと混乱しそうなのでちゃんと書いておきます(^^)/

【Pythonの使用環境について】
Anaconda
Google Colaboratory
当ブログはこれをメインに使った計算結果です。

関連記事

 

☟書籍も紹介しておきます。
こちらの本がPython初心者が挫折することなく勉強できる本です。
(本記事のようのPython使用環境と異なりますが、とてもわかりやすいので全く問題ありません)

スポンサーリンク

タプル型とは?

 

数値型や文字列はそれ自体でひとつのデータ(値)でした。
タプル型は、リスト型や辞書型と同じように複数のデータをひとまとまりに扱うことができます。

まずは、タプル型の書き方から確認しましょう。

【ポイント】
タプル型は()で囲み、データを「,(カンマ)」で区切る。

 

では、実際にコードを書いてみましょう。

要素の値、タイプ、アドレス番号も出力しておきます。

【結果】

このようにタプルはリスト型と同じく、異なる型のデータを格納することができます。

カマキリ

リスト型とタプル型で何が違うのか?

ここまでだと、リスト型とタプル型で違いが無いように思えます。

 

リスト型とタプル型の違い

 

リスト型とタプル型の違いを理解するために、リスト型でできることをタプル型でも同じことを行ってみます。

「リスト型」の記事はこちら

 

  • リスト型で要素を変更する
    以下のようにリストを用意して要素を出力してみます。

 

【結果】

ここで、要素の値を変更してみます。

【結果】

リスト型は要素の値を自由に変更することができるのですよね。

ここで注意すべき点は、アドレスを変えずに(オブジェクトを変えずに)要素の値が変更できるという点です。

  • タプル型で要素を変更する
    もう一度以下のようなタプル型を用意して要素を出力してみます。

【結果】

ここで、要素の値を変更してみます。

【結果】

エラーが出てきます。
これは、タプル型では要素の値を変更できないということです。
これがリスト型とタプル型の違いのひとつです。

しかし、勘違いしてはいけないのは、アドレスを変えれば(オブジェクトを変えれば)要素の値が変更できるということです。

実際にコードを書いてみましょう。

【結果】

エラー無く要素を出力することができました。

そして、よく見るとアドレスが「140677348016488」から「140677347667904」に変わっています。
このようにタプル型は違うアドレスに変数を代入するようにすれば(違うオブジェクトを作り直す)、要素の値は違うものを格納できるのです。
もちろんこれはリスト型でもできます。

絵にするの↑こんな感じです。
要するに、タプル型は箱の中身(要素)は直接変更することはできないけど、違う箱さえ用意すれば新しい要素を作成することができるということです。

そして、Pythonのタプルはオブジェクトを変えずに要素を変更したり削除したりすることはできません。

カマキリ

タプル型は結構制限が強いのですね

タプル型の要素の取り出し

 

タプル型の要素の取り出しは、リスト型と同じなのでリスト型の記事をご参考ください。

「リスト型」の記事はこちら

 

タプル型の要素の取り出し方法の記述は以下です。

【結果】

リスト型と同じ書き方ですね(^^)

タプル型のメソッド

 

タプル型のメソッドはリスト型に比べると驚くほど少ないです。
※リスト型で使うメソッド(公式ドキュメント)としては以下のものがありますが、タプル型はその中でも黄色でハイライトした
「indexとcount」だけです。

append リストの末尾に要素を一つ追加
extend リストに別のリストを追加
insert 指定した位置に要素を追加
remove 要素の値を削除
pop 指定した位置に要素を追加
index リストのインデックスを知りたい
count リスト内の要素の数を知りたい
sort リスト内の要素の並べ替え
copy リストの要素をコピーする
clear リスト中の全ての要素を削除
reverse リストの要素を、インプレース演算で逆順にします。

タプル型のメソッドは少ないですが、使い方を確認しておきましょう。

しかし、「indexとcount」メソッドはリスト型と同じであるため、リスト型を学んでいる人にとっては目新しいことではないため、復習として見てもらえればと思います。

  • indexメソッド


    リスト中で、値 x を持つ最初の要素の位置をゼロから始まる添字で返します。 該当する要素がなければ、ValueError を送出します。docs.python.jp より引用

実際にコードを書いてみましょう。

【結果】

‘Physics’という要素がインデックス3にあるので「3」という数字が出力されました。

では、以下のように要素にはないものを指示してみます。

【結果】

エラーメッセージが返ってきました。

  • countメソッド


    タプルでの x の出現回数を返します。

実際にコードを書いてみましょう。

「’商品A’」という要素が何個あるかを数えることができます。

【結果】

カマキリ

リスト型と同じでしたね。

ちなみに、タプル同士の足し算はどういう結果になるのかもついでに見ておきましょう。

【結果】

これもリスト型と同じでした(^^)

タプル型の方がリスト型よりパフォーマンスが良い

 

Pythonで変数のメモリサイズを確認する方法を覚書として書いておきます。

Pythonの標準モジュールの「sys」を使って、引数のサイズをバイト数を確認しておきます。

リスト型のバイト数

【結果】

タプル型のバイト数

【結果】

タプル型の方が少ないメモリでデータを格納できているのがわかります。


 

カマキリ

ここは「おまけ」です(あまり理解していない<(_ _)>)

パフォーマンス観点として、裏でどのような挙動をしているのかを dis() で確認したいと思います。

dis モジュールは CPython バイトコード bytecode を逆アセンブルすることでバイトコードの解析をサポートします。 このモジュールが入力として受け取る CPython バイトコードはファイル Include/opcode.h に定義されており、 コンパイラとインタプリタが使用しています。
ref:dis — Python バイトコードの逆アセンブラ

リスト型

【結果】

要素がどのようにスタックされているのかがわかります。
リスト型は要素をひとつひとつスタックしています。

一方、タプル型どうなっているのでしょうか?

タプル型

【結果】

タプル型はリスト型のように別々にスタックしているのではなく、まとめてスタックしているのがわかります。

カマキリ

「おまけ」終わり<(_ _)>

まとめ

 

タプル型をリスト型と比較しながら解説をしました。

タプル型は箱の中身(要素)は直接変更することはできないけど、違う箱さえ用意すれば新しい要素を作成することができる
そして、Pythonのタプルはオブジェクトを変えずに要素を変更したり削除したりすることはできません。

リスト型で使うメソッド(公式ドキュメント)としては以下のものがありますが、タプル型はその中でも黄色でハイライトした
「indexとcount」だけです。

append リストの末尾に要素を一つ追加
extend リストに別のリストを追加
insert 指定した位置に要素を追加
remove 要素の値を削除
pop 指定した位置に要素を追加
index リストのインデックスを知りたい
count リスト内の要素の数を知りたい
sort リスト内の要素の並べ替え
copy リストの要素をコピーする
clear リスト中の全ての要素を削除
reverse リストの要素を、インプレース演算で逆順にする

Pythonの記述についてもっと学びたいという方には以下の参考書をお勧めします。
初心者でも挫折することなく学ぶことができます。

みんなのPython 第4版

みんなのPython 第4版

柴田 淳
2,673円(12/27 06:32時点)
発売日: 2016/12/21
Amazonの情報を掲載しています

Pythonの辞書的な参考書としては以下の参考書をお勧めします。

現場ですぐに使える! Pythonプログラミング逆引き大全 357の極意

現場ですぐに使える! Pythonプログラミング逆引き大全 357の極意

俊哉, 金城
9,251円(12/27 02:21時点)
Amazonの情報を掲載しています
関連記事もどうぞ

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です