python入門講座 | tuple型の使い方1(タプル型の特徴とlist型との違い)[第35回]

アラサーOLのためのpython入門講座
Tuple型はlist型とほぼ同じですが、一度作成した変数の要素を変更できません。

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日はtuple型(=タプル型)変数について解説します。Tuple型はlist型とよく似た配列タイプの変数型です。Tuple型の挙動はlist型とほとんど同じですが、変数を一度作成すると要素を変更することができない点が異なります。

この記事を読めば、tuple型変数の特徴を知り、pythonプログラミングの知識を深めることができます。ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Background | tuple型の特徴

tuple型(タプル型)はlist型と同様、一つの変数に複数の値を格納することができる変数の型です。日本語では「タプル型」と呼ばれますが、本稿ではtuple型と呼びます。tuple型は、複数の値を格納することができる配列タイプの変数の中では、格納できる値の数やtypeが自由に設定できる柔軟な変数です。配列タイプの変数の種類と特徴についてはこちらの記事を参照ください→「python入門講座 | 配列タイプ変数の種類と特徴(リスト, NumPy配列, DataFrameなど)」。

tuple型(タプル型)とlist型との共通点と相違点について解説します。tuple型には、

  1. どんな型の値や変数でも格納できる (list型と同じ)
  2. 格納された要素を変更できない (list型と異なる)

という特徴があります。1つ目のどんな型の値や変数でも格納できるというのは、これまでに扱ったlist型と同じです(過去記事「python入門講座 | List型の使い方1(リストを作成する方法)[第23回]」参照)。int型、float型、str型などの単一の変数はもちろん、tuple型の中にtuple型やlist型、dict型を格納して入れ子構造にすることも可能です。今回の記事では、格納された要素が変更できないという2つ目の点を詳しく見ていきます。



mutable(変更可能体)とimmutable(変更不可能体)

tuple型変数を一度定義すると、その要素を変更できないのはtuple型変数がimmutableだからです。Pythonの変数にはmutableとimmutableの2種類が存在します。tuple型はimmutable、list型やdict型はmutableです。mutableは変数を部分的に更新できる種類の変数です。日本語では変更可能体と呼びます。逆に、immutableは変数を部分的に更新することはできません。日本語では変更不可能体と呼びます。immutableな変数を更新する際には、変数全体を再定義する必要があります。



mutableな変数の性質

mutableな変数の例として、list型やdict型があります。これらは配列タイプの変数で、格納された要素それぞれを変更することができるのでmutableな変数です。mutableな変数では部分的な変更を加えても変数のメモリアドレスは変わりません。メモリアドレスを変えずに変数を変更できることがmutableの性質です。

例えば、以下のようにlist型変数に変更を加え、その前後でメモリアドレスを確認してみてください。

# define a list variable
a = [0,1,2]
# check its id
print(id(a), a)

# change 1st element by adding unity
a[0] += 1
# check its id
print(id(a), a)

これを実行すると変数aの0番目の要素(a[0])を変更する前後でメモリアドレスが同一であることが確認できます。このようにmutableではメモリアドレスすなわち変数自体はそのままで、格納された値だけ変更することができます。



immutableな変数の性質

immutableな変数の一つがtuple型です。tuple型も配列タイプの変数で複数の要素を格納することができますが、一度格納された要素は変更することができません。こちらは今回の記事で詳しく見ていきます。配列タイプではないint, str, float型などもimmutableな変数です。これらには要素を変更するという概念がないのでわかりにくいですが、変数を変更すると変数自体の再定義が行われます。具体的には値を変更するとメモリアドレスが変化します。これは変数自体が再定義されていることを意味します。

例えば、以下のようにint型変数を変更しながらメモリアドレスを確認してみてください。

# define an int variable
a = 0
# check its id
print(id(a))

# change the value by adding unity
a += 1
# check its id
print(id(a))

これを実行すると、変数aの値を変更する前後でメモリアドレスが変わっていることが確認できるはずです。メモリアドレスが変更されるということは変数自体が再定義されたことを意味します。このようにimmutableでは変数を一部だけ変更することはできません。



mutableとimmutableの性質のまとめ

mutableとimmutableの性質をまとめると以下のようになります。

変数の変更変数型の例
mutable部分的な更新が可能list, dictなど
immutable部分的な更新は不可
(変数の再定義が必要)
int, str, float, tupleなど
表1. mutableとimmutableの性質

mutableとimmutableについてはこちらの外部サイトに詳しい解説があります。理解を深めたい方は御覧ください。



Method | tuple型変数の作成方法と使用例

Tuple型変数を作成する方法と使用例を解説します。実際に手を動かしながら学んでいきましょう!Jupyter Notebookを立ち上げてコーディングしながら読み進めてください。練習問題の後にコーディング例も掲載しますので、やってみてどうしてもわからなければそれを見て進めてください。



準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_tuple_intro」という名前のpython notebookを作成してください。ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これを見ながらやってみてください。

python notebookを起動したら、適宜Markdownセルに説明書きを加えながら下記の説明に沿ってコードを書いて実行していきましょう。Markdownセルやコードセルなどの用語やこれらの使い方についても、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。練習問題の後にpython notebookの例を掲載します。もし書き方がわからなければそちらを見てください。



tuple型変数を作成する方法 | 丸括弧()でtuple型変数を定義

tuple型変数を作成するには丸括弧()を使います。丸括弧とカンマで

変数 = (値1, 値2, ...)

のように変数を定義します。



tuple型変数を作成する例

tuple型変数を作成してみましょう。以下を実行してください。

# define a variable
var_tuple = (1, 'a', 3.14, [1,2,3], {'a':'A', 'b':'B'})

# print the variable
print(type(var_tuple))
print(var_tuple)

この例ではまず、変数var_tupleに「1, a, 3.14, [1,2,3], {‘a’:’A’, ‘b’:’B’}」という値をtuple型として格納しています。それぞれの値の型はint, str, float, list, dictです。このように、tuple型では異なる型の値を要素として格納することができます。次に、print文で変数var_tupleの型と変数自体を出力しています。

上の例を実行すると、以下のように変数の型と変数の内容が表示されます。

<class 'tuple'>
(1, 'a', 3.14, [1, 2, 3], {'a': 'A', 'b': 'B'})



tuple型変数の要素変更 | 要素の変更は不可、要素の要素は可な場合もある

tuple型変数はimmutableすなわち変更不可能体なので、一度定義した後は要素の変更を行うことはできません。tuple型変数の要素を

tuple型変数[0] = 1

というように変更しようとした場合はエラーとなります。

一方で、tuple型変数の要素がlistやdictなどのmutableな変数である場合、その要素の一部については変更することができます。以下では、

  • tuple型変数の要素を変更するとエラーとなる
  • tuple型変数の要素がmutableな場合(listやdict)、その要素は変更できる

ことを実際の例で確かめます。



tuple型変数の要素変更によるエラーの例

tuple型の要素が変更できないことを実際に確かめてみましょう。以下の例を実行してみてください。

# define a variable
var_tuple = (1, 'a', 3.14, [1,2,3], {'a':'A', 'b':'B'})

# print the variable
print(var_tuple)

# try to change an element
var_tuple[0] = 2 # -> error

この例では、最後の行でtuple型変数var_tupleの0番目の要素を変更しようとしています。tuple型はimmutableなので要素の変更はできません。したがって結果はエラーとなります。実行すると以下のようになるはずです。

(1, 'a', 3.14, [1, 2, 3], {'a': 'A', 'b': 'B'})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/cc/zd_rdmgn14z8hw956cpfjt480000gn/T/ipykernel_37314/2428226851.py in <module>
      6 
      7 # try to change an element
----> 8 var_tuple[0] = 2 # -> error

TypeError: 'tuple' object does not support item assignment

このようにtuple型変数の要素は変更できないというエラーが出力されます。



tuple型変数の要素がmutableな場合、その要素を変更する例

tuple型の要素がlistやdictなどのmutableの場合、それらの要素については変更できることを確かめましょう。以下の例を実行してみてください。

# define a variable
var_tuple = (1, 'a', 3.14, [1,2,3], {'a':'A', 'b':'B'})

# print the variable
print(var_tuple)

# chage the list element contained in the variable
var_tuple[3][0] = 4 # [1,2,3] -> [4,2,3]

# print the variable
print(var_tuple)

# chage the dict element contained in the variable
var_tuple[4]['a'] = 'AA' # 'a':'A' -> 'a':'AA'

# print the variable
print(var_tuple)

この例で作成されたtuple型変数var_tupleは、0番目から2番目の要素はimmutable、3番目のlistと4番目のdictはmutableです。したがって、3番目と4番目の要素の要素、すなわちlistの中身とdictの中身は変更することができます。この例では変数var_tupleの3番目の要素であるlistの0番目(var_tuple[3][0])と、4番目の要素であるdictのkey=’a’(var_tuple[4][‘a’])を変更しています。これらはmutableな変数の更新を行なっているためエラーにはなりません。

上の例を実行すると以下のように出力されます。

(1, 'a', 3.14, [1, 2, 3], {'a': 'A', 'b': 'B'})
(1, 'a', 3.14, [4, 2, 3], {'a': 'A', 'b': 'B'})
(1, 'a', 3.14, [4, 2, 3], {'a': 'AA', 'b': 'B'})

ただし、当然ですが変数var_tupleの要素そのものは変更できません。以下のように、3番目のlist全体を変更しにいくことはできません。

# try to change 3rd element
var_tuple[3] = [5,6,7] # error

これを実行すると

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/cc/zd_rdmgn14z8hw956cpfjt480000gn/T/ipykernel_37314/1247140728.py in <module>
      1 # try to change 3rd element
----> 2 var_tuple[3] = [5,6,7] # error

TypeError: 'tuple' object does not support item assignment

のようにエラーとなります。



Tuple型変数の利用例(関数の引数として用いる例)

tuple型変数はlistで代用できるので、あえてtuple型を使う機会は少ないですが、ここでは関数の引数としてtuple型を使う例を扱います。引数とは関数に対する入力となる変数のことです。

引数を複数取る関数に対して引数を与える場合、*(アスタリスク)とtupleを使うとシンプルになります。関数の解説はまだ行っていないので応用的な内容です。真似してやってみて「なんとなくこんなもんか」ぐらいの理解を目指してください。

例えば、引数を3つ取る関数を考えます。以下を実行して関数my_funcを作成しましょう。

# define a function with three arguments
def my_func(var1, var2, var3):
    print('var1:', var1)
    print('var2:', var2)
    print('var3:', var3)

この関数を呼び出すときには、引数を3つ与える必要があります。以下を実行してください。

# use my_func
my_func('a', 'b', 'c')

実行すると関数my_funcの引数として’a’, ‘b’, ‘c’の3つが渡されます。結果は以下のように出力されます。

var1: a
var2: b
var3: c



Unpack演算子(*)とtuple型変数で複数の引数を関数に渡す

Unpack演算子とtupleを使うとシンプルに書くことができます。与える引数たちをtupleとして事前に定義しておくことができるようになります。以下のように書きます。実行してみましょう。

# define a tuple variable
var_tuple = ('A', 'B', 'C')

# use the function
my_func(*var_tuple)

ここでは、まずtuple型変数var_tupleに’A’, ‘B’, ‘C’の3つの要素が格納されています。この変数にunpack演算子を適用し「*var_tuple」とすることで、格納された要素を3つの変数として取り出す(unpack)ことができ、関数の3つの引数として認識されます。実行結果は以下の通りです。

var1: A
var2: B
var3: C



Unpack演算子(*)を忘れるとエラーになる

上の例でUnpack演算子を使わないで関数に渡した場合どうなるでしょうか?この場合、変数var_tuple全体が1つ目の引数として認識されます。2つ目と3つ目の引数が渡されていないと判断されるため、引数不足のエラーとなります。試しに以下を実行して確認してみてください。

# use the function without unpacking
my_func(var_tuple) # error

実行すると、以下のように「2つ目と3つ目の引数が与えられていない」というエラーとなります。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/cc/zd_rdmgn14z8hw956cpfjt480000gn/T/ipykernel_32088/226815422.py in <module>
      1 # use the function without unpacking
----> 2 my_func(var_tuple) # error

TypeError: my_func() missing 2 required positional arguments: 'var2' and 'var3'



Unpack演算子(*)とlistでもOK

Tuple型変数の代わりにlistを用いることも可能です。先程と同様、unpack演算子とlistを引数として関数に渡します。以下を実行してみましょう。unpack演算子とtupleのときと同じ結果になるはずです。

# define a list variable
var_list = ('A', 'B', 'C')

# use the function
my_func(*var_list)



Result | 練習問題

練習問題をやってみましょう。以下の処理を行うコードを書いてみましょう。

  1. tuple型変数var_tupleを以下の値で作成し、print文で変数の型と変数を出力してください。
    • 値1: ‘dog’
    • 値2: ‘cat’
    • 値3: ‘mouse’
  2. tuple型変数prefectural_capitalsを以下のlist型の値で作成し、print文で出力してください。
    • 値1: [‘Hokkaido’, ‘Hakodate’]
    • 値2: [‘Kanagawa’, ‘Yokohama’]
    • 値3: [‘Okinawa’, ‘Naha’]
  3. 変数prefectural_capitalsの0番目の要素のうち”Hakodate”を”Sapporo”に変更し、print文で出力してください。
  4. 変数prefectural_capitalsの1番目の要素を[‘Kagawa’, ‘Takamatsu’]に変更し、エラーとなることを確認してください。



練習問題の回答例

練習問題の回答が完成したら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!参考にしてみてください。また、今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございます!
今回はtuple型変数の作成方法と特徴を解説しました。基本的にはlist型で済むのであえてtuple型を使わなければいけない場面は少ないですが、tuple型の扱い方を知っておくとプログラミングの知識が深まります。そのような知識は他人のコードを読み解くときなど、実戦の場面で役立ちます!

以上「python入門講座 | tuple型の使い方1(タプル型の特徴とlist型との違い)」でした!
またお会いしましょう!Ciao!



References | 参考

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

Pythonの参考教科書

参考外部サイト

コメント

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