タプルの定義と利点 | リストとタプル | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

タプルの定義と利点

Pythonのタプルは、リストに非常によく似たコレクション型(データのまとまり)であり、複数の要素を1つのデータ構造として格納することができます。ただし、リストとは決定的に異なり、タプルは不変(immutable / イミュータブル)です。これは、一度定義した後、要素を追加・削除・変更することが一切できないという強力な特徴を持っています。この記事では、タプルの定義方法と利点について詳しく解説します。

タプルの定義

タプルを定義する際は、()(丸括弧)を使用します。リストと同様に、タプルの要素は異なるデータ型を含めることができます。

# タプルの定義
fruit_tuple = ("apple", "banana", "cherry")
number_tuple = (1, 2, 3, 4, 5)
mixed_tuple = (1, "two", 3.0, [4, 5])

print(fruit_tuple)  # ('apple', 'banana', 'cherry')
print(number_tuple)  # (1, 2, 3, 4, 5)
print(mixed_tuple)  # (1, 'two', 3.0, [4, 5])

# 1要素のタプル(カンマが必須!)
single_element_tuple = (42,)
print(single_element_tuple)  # (42,)

この例では、複数のタプルを定義し、1つの要素だけを持つタプルの定義方法も示しています。

追加解説:なぜ1つの要素のときは「カンマ」が必要なの?

Pythonにおいて、丸括弧 () はタプルを作るためだけでなく、数学と同じように「計算の優先順位を上げるためのカッコ」としても使われます。そのため、単に (42) と書くだけだと、Pythonは「ただの数値の42」と解釈してしまいます。「これは計算用ではなく、タプルというデータ型ですよ」とPythonに明確に教えるために、末尾のカンマ , が絶対に必要になります。

# カンマの有無によるデータ型の違い
not_a_tuple = (42)    # カンマなし
is_a_tuple = (42,)    # カンマあり

print(type(not_a_tuple))  # <class 'int'> (ただの整数型)
print(type(is_a_tuple))   # <class 'tuple'> (タプル型)

タプルの不変性

タプルの最大のアイデンティティは、不変性(immutable)です。タプルを定義した後、その中身を書き換えることはできません。リストでは、要素の追加や削除が可能ですが、タプルではそれが禁止されているため、プログラム内で「絶対に書き換わってほしくない安全なデータ」を保持したい場合に役立ちます。

# タプルは不変
fruit_tuple = ("apple", "banana", "cherry")

# 以下の行を実行しようとすると、Pythonがエラーを出して保護します
# fruit_tuple[0] = "orange"  # TypeError: 'tuple' object does not support item assignment

この例では、タプルの要素を変更しようとするとエラー(TypeError)が発生することを示しています。

タプルの利点

「リストだけで十分ではないか」と感じるかもしれませんが、タプルにはリストにはない独自の大きなメリットが4つあります。

  • データの整合性(不変性): プログラムの途中で誤って中身が書き換わるリスクがないため、バグを未然に防ぐことができます。
  • 処理の高速性: Pythonの内部システムにおいて、タプルはリストに比べて構造がシンプルなため、読み込みや処理がより高速に行われます。
  • 辞書のキーにできる: リストは中身が変わるため「辞書(dict)のキー」に指定できませんが、不変なタプルであればキーとして安全に利用できます。
  • メモリ効率: 内部で要素が増減しない前提でメモリを確保するため、リストに比べて消費するメモリ量が少なくて済みます。

タプルの使用例と「アンパック」

タプルは、位置情報(緯度・経度)や設定値、あるいは関数から複数の結果をまとめて返したいときに非常によく使われます。また、タプルの中身を複数の変数へ一気に分解して代入する「アンパック(多重代入)」というPythonの定番テクニックとも相性抜群です。

# 座標データをタプルで表現
coordinates = (35.6895, 139.6917)  # 東京の緯度と経度
print(coordinates)

# 関数から複数の値を返す場合(実質的にタプルを返している)
def get_status():
    return ("OK", 200)

# アンパック:タプルの中身を別々の変数へ一気に取り出す
status, code = get_status()
print(status)  # OK
print(code)    # 200

タプルの操作

タプルは不変であるため、要素の追加(append)や削除(remove)といったリスト用のメソッドは持っていません。しかし、インデックス(添字)を指定して特定の要素を取り出したり、範囲を切り出す「スライス操作」を行ったりすることは可能です。

# タプルの要素にアクセス
fruit_tuple = ("apple", "banana", "cherry")
print(fruit_tuple[1])  # banana (0から数えて1番目)

# スライス操作(新しく切り出された「タプル」が返る)
print(fruit_tuple[0:2])  # ('apple', 'banana')

まとめ

タプルは、データの不変性を保証し、プログラムを安全かつ効率的に動作させるための重要なコレクション型です。中身を自由に変更・増減させたい場合は「リスト」、一度決めたデータを変更せず、安全かつ高速に扱いたい場合(関数からの複数値の返却や座標データなど)は「タプル」というように、それぞれの強みを理解してスマートに使い分けられるようになりましょう。