Pythonのタプル型の使い方をプログラミング入門者向けにわかりやすく解説します。
Pythonの「タプル型」とは?
タプルとは、複数の値をひとつにまとめて保存できるデータ型です。
Pythonでは、リストと似た使い方ができますが、一度作成したら中身を変更できないという大きな違いがあります。
【タプルの特徴】
① 変更不可(イミュータブル) → 作った後に中身を変更できません
② 丸括弧 ( ) で囲む → リストは [ ] ですが、タプルは ( ) を使います
③ 要素が1つだけの場合はカンマが必要 → カンマがないと、ただの値として扱われてしまいます
【タプルの使いどころ】
① 設定値や定数をまとめたいとき
② 関数の戻り値として複数の値を返したいとき
③ データの変更を防ぎたいとき(安全性の向上)
タプルの書き方
タプルの書き方は以下のとおりです。
【書式】
変数名 = (要素1, 要素2, …)
各要素をカンマ区切りし、丸括弧 ( ) で囲みます。
以下のコードは、タプル型の変数を作成する例です。
# 勇者ぴこりの固定プロフィール(名前、種族、出身地)
profile = ("兎野ぴこり", "兎族", "星の森")
# 中身の表示
print("勇者のプロフィール:" , profile)
リストと同様に、異なる型のデータも格納も可能です。
以下コードのように、数値と文字列など、型が違うデータも同じタプルに入れることができます。
# 勇者ぴこりの固定プロフィール(名前、種族、出身地、初期レベル)
profile = ("兎野ぴこり", "兎族", "星の森", 5)
# 中身の表示
print("勇者のプロフィール:" , profile)
以下コードのように、要素が1つだけのとき、1つ目の要素の後にカンマを入れる必要があります。
# 勇者ぴこりの固定プロフィール(名前)
profile = ("兎野ぴこり", )
# 中身の表示
print(profile)
"金貨"
として扱われてしまいます。タプル同士の連結
Pythonでは、算術演算子「+」を使って、複数のタプルをつなげることができます。
【書式】
新しいタプル = タプル1 + タプル2
# ぴこりの前半の旅路
journey_part1 = ("星の森", "ルミナ村", "風の谷")
# 後半の旅路
journey_part2 = ("炎の洞窟", "月の塔")
# 全旅路を連結
full_journey = journey_part1 + journey_part2
print(full_journey)
このように、+
を使うことで、複数のタプルをひとつにまとめることができます。
元の journey_part1
や journey_part2
はそのまま残り、full_journey
に新しいタプルが作られます。
+
演算子はタプル同士でのみ使えます。リストや他の型とは直接連結できません。② 元のタプルは変更されないため、安全に履歴や設定を残したまま新しいデータを作れます。

要素を繰り返して生成
Pythonでは、アスタリスク *
演算子を使うことで、タプルの中身を指定した回数だけ繰り返すことができます。
この操作は、新しいタプルを生成するもので、元のタプルは変更されません。
【書式】
新しいタプル = 元のタプル * 繰り返し回数
繰り返し回数は整数で指定でき、0
にすると空のタプルになります。
以下のコードは、「元のタプル」の中身を2回繰り返した「新しいタプル」を生成する例です。
# 呪文の詠唱パターン
chant = ("ルー", "ラ", "ラー")
# 3回繰り返して詠唱
full_chant = chant * 3
# 詠唱の表示
print(full_chant)
このように、* 3
を使うことで、タプルの中身が3回繰り返されます。

以下は、初心者にもわかりやすく丁寧に解説した「タプル内の要素の取得」についての内容です。
コードはぴこりのRPG風にアレンジしつつ、説明は通常スタイルで整理しています。
タプル内の要素を取得
Pythonのタプルでは、リストと同じようにインデックス番号(要素番号)を使って、特定の要素を取り出すことができます。
ただし、取り出すことはできても、変更することはできません。これはタプルが「変更不可(イミュータブル)」なデータ型だからです。
【書式】
タプル名[要素番号]
※インデックス番号は 0から始まる ので、最初の要素は [0]
になります。
以下のコードは、インデックス番号を指定してタプルから要素を取り出す例です。
# ぴこりが訪れた町の記録
visited_towns = ("星の森", "ルミナ村", "風の谷", "炎の洞窟", "月の塔")
# 2番目に訪れた町(インデックス1)
print("2番目に訪れた町:", visited_towns[1])
IndexError
になります。② タプルの中身は変更できないため、
visited_towns[1] = "新しい町"
のような書き換えはできません。
タプルのスライス(範囲指定)
Pythonでは、タプルの中から特定の範囲の要素を取り出すことができます。この操作を「スライス」と呼び、リストと同じように使えます。
【書式】
タプル名[開始インデックス : 終了インデックス]
- インデックスは **0から始まります*。
- 終了インデックスの1つ手前までが対象になります。
- スライスしても元のタプルは変更されません。
- スライスの結果は新しいタプルとして返されます。
以下のコードは、タプルから特定の範囲にある要素をスライスで取り出す例です。
# ぴこりが訪れた町の記録
visited_towns = ("星の森", "ルミナ村", "風の谷", "炎の洞窟", "月の塔")
# 2番目〜3番目の町(インデックス1〜2)
print(visited_towns[1:3]) # 出力:('ルミナ村', '風の谷')
# 2番目から最後まで
print(visited_towns[1:]) # 出力:('ルミナ村', '風の谷', '炎の洞窟', '月の塔')
# 最初から2番目まで(インデックス0〜1)
print(visited_towns[:2]) # 出力:('星の森', 'ルミナ村')
インデックスは 0から始まる ので、visited_towns[1:3]
は「2番目〜3番目の町」を意味します。

要素数(長さ)を取得
Pythonでは、タプルの中にいくつの要素が入っているかを調べることができます。
このとき使うのが、組み込み関数 len()
です。リストや文字列と同じように使えます。
【書式】
len(タプル名)
以下のコードは、len()
関数でタプルに入っている要素の数(長さ)を取得する例です。
# ぴこりの持ち物
items = ("ポーション", "たいまつ", "地図", "パン", "水筒")
# 持ち物の数を確認
print("持ち物の数:", len(items))

リストとタプルの相互変換
Pythonでは、組み込み関数 tuple()
を使うことで、リスト(可変)をタプル(不変)に変換することができます。
タプルに変換することで、リスト内のデータを変更される心配のない「固定データ」として扱うことができます。
tuple(リスト名)
以下のコードは、tuple()
関数でリストをタプルに変換する例です。
# ぴこりの持ち物
items_list = ["ポーション", "たいまつ", "地図", "パン", "水筒"]
# タプルに変換(もう持ち物を変更しない!)
items_tuple = tuple(items_list)
# タプルの表示
print("持ち物:", items_tuple)
逆に、組み込み関数 list()
を使うことで、タプルからリストへ変換することもできます。
以下のコードは、list()
関数でタプルをリストに変換する例です。
# ぴこりの持ち物
items_tuple = ("ポーション", "たいまつ", "地図", "パン", "水筒")
# リストに変換(持ち物を変更できるようになる!)
items_list = list(items_tuple)
# タプルの表示
print("持ち物:", items_list)

タプルのアンパック(分解)
アンパックとは、タプルの中身を個別の変数に取り出すことです。 ぴこりが持ち物を袋から1つずつ取り出して確認するようなイメージです。
【書式】
変数1, 変数2, … = タプル
- タプルの要素数と変数の数は一致している必要があります。
- 一部だけ取り出したい場合は、
_
(アンダースコア)を使って無視することもできます。
以下のコードは、勇者ぴこりのステータスが格納されたタプルをアンパックする例です。
# ぴこりのステータス(レベル・職業・所属)
status = (5, "勇者", "星の森ギルド")
# アンパック(分解)
level, job, guild = status
# 結果を表示
print("レベル:", level) # レベル: 5
print("職業:", job) # 職業: 勇者
print("所属:", guild) # 所属: 星の森ギルド
職業: 勇者
所属: 星の森ギルド
以下のコードは、勇者ぴこりのステータスが格納されたタプルを職業だけ無視してアンパックする例です。
# ぴこりのステータス(レベル・職業・所属)
status = (5, "勇者", "星の森ギルド")
# アンパック(分解)
level, _, guild = status
# 結果を表示
print("レベル:", level) # レベル: 5
print("所属:", guild) # 所属: 星の森ギルド
所属: 星の森ギルド
for文でのループ処理
リストと同様に、タプルは繰り返し処理(ループ)にも使えます。
ぴこりが持ち物をひとつずつ確認するように、for
文で順番に取り出して処理できます。
# ぴこりの持ち物
items = ("ポーション", "たいまつ", "地図", "パン", "水筒")
# 1つずつ要素を確認
for item in items:
print("持ち物:", item)
持ち物: たいまつ
持ち物: 地図
持ち物: パン
持ち物: 水筒
インデックス付きで表示したい場合、
for i, item in enumerate(items):
print(f"{i+1}番目の持ち物:{item}")
ネストされたタプルの処理
ネスト(nest)とは「入れ子構造」のことです。タプルの中にさらにタプルが含まれている構造を「ネストされたタプル」といいます。
以下のコードは、二重構造でタプルがネストされている例です。(タプルの要素がタプルになっています)
# ぴこりの仲間たち(名前, 職業, レベル)
party = (
("ぴこり", "勇者", 5),
("みより", "魔法使い", 7),
("あくび", "盗賊", 6)
)
ネストされたタプルの要素を取り出すには、インデックスを2段階で指定します。(リストと同様、外側→内側の順で [外][内]
と書きます)
以下のコードは、ネストされたタプルの要素を取り出す例です。
# ぴこりの仲間たち(名前, 職業, レベル)
party = (
("ぴこり", "勇者", 5),
("みより", "魔法使い", 7),
("あくび", "盗賊", 6)
)
# ぴこりの職業を取り出す
print("ぴこりの職業", party[0][1]) # 魔法使い
# あくびのレベルを取り出す
print("あくびの職業",party[2][2]) # 6
party[0]
→ 最初の仲間(ぴこり)のタプルparty[0][1]
→ 外:ぴこりのタプル、内:2番目の要素(職業)
ネストされたタプルも、for
文で簡単にループできます。
以下コードのように、アンパックと組み合わせると、中身を直接変数に分けて扱うこともできます。
# ぴこりの仲間たち(名前, 職業, レベル)
party = (
("ぴこり", "勇者", 5),
("みより", "魔法使い", 7),
("あくび", "盗賊", 6)
)
# 仲間の情報を表示
for name, job, level in party:
print(f"{name}({job})のレベルは {level} です")
みより(魔法使い)のレベルは 7 です
あくび(あくび)のレベルは 6 です
練習問題(基礎固め & 資格勉強用)
本ページで学んだ内容の基礎を固めるため、また「Python 3 エンジニア認定基礎試験」や「基本情報技術者試験」などの資格対策にも役立つ練習問題を作成しました。
【問題1】タプルの基本構文
次のうち、Pythonでタプルを定義する正しい方法を選びなさい。
A. profile = [“勇者”, “人間”, “星の森”]
B. profile = {“勇者”, “人間”, “星の森”}
C. profile = (“勇者”, “人間”, “星の森”)
D. profile = <“勇者”, “人間”, “星の森”>
解説:Pythonでは、タプルは丸括弧 `()` を使って定義します。リストは `[]`、集合は `{}` を使います。
【問題2】タプルの変更可否
タプルに関する説明として正しいものを選びなさい。
A. タプルは要素の追加・削除が可能
B. タプルは一度作成すると変更できない
C. タプルは辞書型の一種である
D. タプルは文字列しか格納できない
解説:タプルは「イミュータブル(変更不可)」なデータ型で、一度作成したら中身を変更できません。
【問題3】1要素タプルの定義
次のうち、1要素のタプルとして正しく定義されているものを選びなさい。
A. item = ("ポーション")
B. item = ("ポーション",)
C. item = ["ポーション"]
D. item = {"ポーション"}
解説:1要素のタプルを定義するには、カンマ `,` を付ける必要があります。カンマがないと単なる文字列として扱われます。
【問題4】要素の取得
次のコードの出力として正しいものを選びなさい。
profile = ("ぴこり", "勇者", "星の森")
print(profile[1])
A. “ぴこり”
B. “勇者”
C. “星の森”
D. エラーになる
解説:インデックスは0から始まるため、`profile[1]` は2番目の要素「勇者」を指します。
【問題5】スライスの結果
次のコードの出力として正しいものを選びなさい。
towns = ("星の森", "ルミナ村", "風の谷", "炎の洞窟")
print(towns[1:3])
A. (“星の森”, “ルミナ村”, “風の谷”)
B. (“ルミナ村”, “風の谷”)
C. (“風の谷”, “炎の洞窟”)
D. (“ルミナ村”, “風の谷”, “炎の洞窟”)
解説:スライス `[1:3]` はインデックス1から2までの要素を取得します(3は含まれません)。
【問題6】要素数の取得
次のコードの出力として正しいものを選びなさい。
items = ("ポーション", "たいまつ", "地図")
print(len(items))
A. 2
B. 3
C. 4
D. エラーになる
解説:`len()` 関数はタプルの要素数を返します。この場合、3つの要素があるため「3」が出力されます。
【問題7】連結演算
次のコードの出力として正しいものを選びなさい。
a = ("星の森",)
b = ("炎の洞窟",)
print(a + b)
A. (“星の森”, “炎の洞窟”)
B. (“星の森炎の洞窟”)
C. [“星の森”, “炎の洞窟”]
D. エラーになる
解説:`+` 演算子でタプル同士を連結すると、新しいタプルが生成されます。
【問題8】繰り返し演算
次のコードの出力として正しいものを選びなさい。
chant = ("ルー", "ラ", "ラー")
print(chant * 2)
A. (“ルー”, “ラ”, “ラー”, “ルー”, “ラ”, “ラー”)
B. (“ルー”, “ラ”, “ラー”)
C. [“ルー”, “ラ”, “ラー”, “ルー”, “ラ”, “ラー”]
D. エラーになる
解説:`*` 演算子でタプルを繰り返すと、指定回数分の要素が連続して並びます。
【問題9】アンパック代入
次のコードの出力として正しいものを選びなさい。
status = (5, "勇者", "星の森ギルド")
level, job, guild = status
print(job)
A. 5
B. “勇者”
C. “星の森ギルド”
D. エラーになる
解説:タプルのアンパック代入では、各変数に順番通りに値が代入されます。`job` には2番目の “勇者” が代入されます。
【問題10】タプルのネスト
次のコードの出力として正しいものを選びなさい。
profile = ("ぴこり", ("勇者", "星の森"))
print(profile[1][0])
A. “ぴこり”
B. “勇者”
C. “星の森”
D. エラーになる
解説:`profile[1]` は内側のタプル `(“勇者”, “星の森”)` を指し、さらに `[0]` で “勇者” を取得します。ネストされたタプルもインデックスでアクセス可能です。
【問題11】タプルの用途
次のうち、タプルを使う利点として正しいものを選びなさい。
A. 要素を変更できるため、柔軟性が高い
B. 要素の順序が保証されない
C. 不変であるため、辞書のキーとして使える
D. メモリ使用量が多くなる
解説:タプルはイミュータブル(不変)なため、辞書のキーとして使用できます。リストは変更可能なのでキーにできません。
【問題12】空のタプル
空のタプルを定義する正しい方法を選びなさい。
A. empty = []
B. empty = ()
C. empty = {}
D. empty = ""
解説:空のタプルは `()` で定義します。`[]` はリスト、`{}` は辞書、`””` は文字列です。
【問題13】タプルの比較
次のコードの出力として正しいものを選びなさい。
a = (1, 2)
b = (1, 3)
print(a < b)
A. True
B. False
C. エラーになる
D. 比較できない
解説:タプルは辞書順で比較されます。最初の要素が同じ場合、次の要素で比較されます。2 < 3 なので True。
【問題14】タプルの入れ子構造
次のコードの出力として正しいものを選びなさい。
data = ("勇者", ("レベル", 5))
print(data[1][1])
A. “レベル”
B. 5
C. (“レベル”, 5)
D. エラーになる
解説:`data[1]` は内側のタプル `(“レベル”, 5)` を指し、`[1]` で 5 を取得します。
【問題15】タプルの型確認
次のコードの出力として正しいものを選びなさい。
value = (100)
print(type(value))
A. <class 'tuple'>
B. <class 'int'>
C. <class 'str'>
D. <class 'list'>
解説:カンマがないため、これは整数型(int)として扱われます。タプルにするには `(100,)` のようにカンマが必要です。
【問題16】タプルの繰り返し
次のコードの出力として正しいものを選びなさい。
a = ("ぴこり",) * 3
print(a)
A. (“ぴこり”, “ぴこり”, “ぴこり”)
B. (“ぴこり”)
C. [“ぴこり”, “ぴこり”, “ぴこり”]
D. エラーになる
解説:`*` 演算子でタプルを繰り返すと、指定回数分の要素が並びます。
【問題17】タプルのスライス
次のコードの出力として正しいものを選びなさい。
towns = ("星の森", "風の谷", "炎の洞窟", "氷の城")
print(towns[:2])
A. (“星の森”, “風の谷”)
B. (“炎の洞窟”, “氷の城”)
C. (“風の谷”, “炎の洞窟”)
D. (“星の森”, “風の谷”, “炎の洞窟”)
解説:スライス `[:2]` はインデックス0〜1の要素を取得します(2は含まれません)。
【問題18】タプルの長さ
次のコードの出力として正しいものを選びなさい。
guilds = ("星の森", "風の谷", "炎の洞窟")
print(len(guilds))
A. 2
B. 3
C. 4
D. エラーになる
解説:`len()` 関数はタプルの要素数を返します。この場合は3つの要素があるため「3」が出力されます。
【問題19】in演算子の使用
次のコードの出力として正しいものを選びなさい。
items = ("ポーション", "たいまつ", "地図")
print("たいまつ" in items)
A. True
B. False
C. エラーになる
D. “たいまつ”
解説:`in` 演算子は、指定した値がタプルに含まれているかを判定します。この場合「たいまつ」は含まれているので True。
【問題20】タプルの代入数不一致
次のコードを実行するとどうなるか選びなさい。
status = ("ぴこり", "勇者")
name, job, guild = status
A. 正常に動作する
B. “guild” に None が代入される
C. エラーになる
D. “guild” に空文字が代入される
課題(実践力強化用)
Pythonプログラミングの実践力を強化したい人向けの課題を用意しました。仕様通りに動くプログラムを書いたり、エラーメッセージを読んでコードを修正するという作業は、プログラミングおいて重要ですので、初心者の方は是非チャレンジしてみてください。
課題① コード作成
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
profile
に「ぴこり」「勇者」「星の森ギルド」を格納する print()
を使って「職業:勇者」と表示する(タプルから取り出す)
仕様を満たすコードは次のようになります。
profile = ("ぴこり", "勇者", "星の森ギルド") print("職業:", profile[1])
課題② コード修正
以下のコードを実行するとエラーが表示されます。
コードを修正して、「ぴこりのレベルは5です」と正しく表示されるようにしてください。
status = ("ぴこり", "勇者", 5)
print("ぴこりのレベルは" + status[2] + "です")
■実行結果(エラーメッセージ: TypeError)
TypeError: can only concatenate str (not "int") to str
数値(int型)と文字列(str型)を `+` で連結しようとするとエラーになります。
数値を文字列に変換するには `str()` を使います。
■修正後のコード
status = ("ぴこり", "勇者", 5) print("ぴこりのレベルは" + str(status[2]) + "です")
課題③ コード作成(アンパック)
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
status
に「5」「勇者」「星の森ギルド」を格納する - アンパック代入を使って
job
変数に職業を代入し、表示する
アンパック代入を使うと、タプルの各要素を個別の変数に分けて代入できます。
status = (5, "勇者", "星の森ギルド") level, job, guild = status print("職業:", job)
課題④ コード修正(1要素タプル)
以下のコードは、タプルとして機能しません。
修正して、1要素のタプルとして正しく動作するようにしてください。
item = ("ポーション")
print(type(item))
■実行結果
<class 'str'>
丸括弧だけではタプルにならず、文字列として扱われます。
1要素のタプルには「カンマ」が必要です。
■修正後のコード
item = ("ポーション",) print(type(item))
■実行結果
<class 'tuple'>
課題⑤ コード作成(繰り返し)
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
chant
に「ルー」「ラ」「ラー」を格納する - それを3回繰り返して表示する
タプルは `*` 演算子で繰り返すことができます。
chant = ("ルー", "ラ", "ラー") print(chant * 3)
課題⑥ コード作成(型確認)
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
data
に「ぴこり」「勇者」「星の森ギルド」を格納する type()
関数を使って、data
の型を表示する
Pythonでは `type()` 関数を使うことで、変数の型を確認できます。
data = ("ぴこり", "勇者", "星の森ギルド") print(type(data))
課題⑦ コード修正(インデックスエラー)
以下のコードはエラーになります。
修正して、「ギルド:星の森ギルド」と表示されるようにしてください。
profile = ("ぴこり", "勇者", "星の森ギルド")
print("ギルド:" + profile[3])
■実行結果(エラーメッセージ: IndexError)
IndexError: tuple index out of range
インデックスは0から始まるため、`profile[3]` は存在しません。
正しくは `profile[2]` を指定します。
■修正後のコード
profile = ("ぴこり", "勇者", "星の森ギルド") print("ギルド:" + profile[2])
課題⑧ コード作成(for文で表示)
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
items
に「ポーション」「たいまつ」「地図」を格納する for
文を使って1行ずつ表示する
たいまつ
地図
タプルはリストと同様に `for` 文で繰り返し処理できます。
items = ("ポーション", "たいまつ", "地図") for item in items: print(item)
課題⑨ コード作成(ネストされたタプル)
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
profile
に「ぴこり」「勇者」「星の森ギルド」「(レベル,HP)」という構造を持たせる - レベルとHPをそれぞれ表示する
HP:120
ネストされたタプルは、インデックスを2段階で指定することでアクセスできます。
profile = ("ぴこり", "勇者", "星の森ギルド", (5, 120)) print("レベル:", profile[3][0]) print("HP:", profile[3][1])
課題⑩ コード作成(in演算子)
以下の仕様を満たすPythonコードを1から書いてください。
- タプル
items
に「ポーション」「たいまつ」「地図」を格納する - 「たいまつ」が含まれているか判定し、結果を表示する
`in` 演算子を使うことで、タプルに特定の要素が含まれているかを判定できます。
items = ("ポーション", "たいまつ", "地図") if "たいまつ" in items: print("たいまつは持っています。") else: print("たいまつは持っていません。")
関連ページ(もっと学びたい人へ)
Pythonの基礎から応用例まで、以下ページから学ぶことができます。
