サイトアイコン 天文学者のpython・音楽・お料理レシピ

python入門講座 | tuple型の使い方3(タプル型にまつわる注意点)[第37回]

変数を定義するとき、末尾にカンマをつけるとtuple型になります。タイプミスでカンマをつけてしまうことがあるので注意が必要です。

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

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

今日はtuple型(=タプル型)変数に関連する注意点について解説します。Pythonのコードを書いていると、本当はそのつもりはないのに、変数がtuple型になってしまうことがあります。小さな問題ですが、知っておくとプログラミングの効率が上がる注意点を紹介します。

この記事を読めば、tuple型変数の更新方法に関係する注意点を知り、pythonプログラミングの効率を高めることができます。ぜひ最後までお付き合いください!

Kaiko

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

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



Background | tuple型の概要

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

tuple型には、

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

という特徴があります。1つ目の特徴はlist型と同じです(過去記事「python入門講座 | List型の使い方1(リストを作成する方法)」参照)。2つ目の特徴はtuple型がimmutableという種類の変数であることに起因します。詳しくは過去記事「python入門講座 | tuple型の使い方1(タプル型の特徴とlist型との違い)」をご参照ください。

今回はtuple型変数の要素を更新する方法を解説します。tuple型変数についての以下の過去記事もご覧ください!

  1. tuple型変数の特徴: python入門講座 | tuple型の使い方1(タプル型の特徴とlist型との違い)
  2. tuple型変数の更新: python入門講座 | tuple型の使い方2(タプル型の更新方法)



Method | tuple型変数に関連する注意点

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



準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_tuple_tips」という名前の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型変数は、丸括弧を使わずに代入する値をカンマで区切るだけでも定義できます。今回紹介する注意点にはこの定義方法が関係するので先に触れておきます。以下を実行してみましょう。

# define a tuple variable with comma
var_tuple = 1, 2, 3

# see its type and value
print('type:', type(var_tuple))
print('value:', var_tuple)

カンマ区切りで定義された変数var_tupleはtuple型変数となります。実行すると以下が表示されます。

type: <class 'tuple'>
value: (1, 2, 3)



要素が1つのtuple型の定義

カンマの後に値がなくても、つまり変数を定義する際に末尾にカンマをつけるだけで、その変数はtuple型になります。以下を実行してみましょう。

# define a tuple variable with a single element using comma
var_tuple = 1,

# see its type and value
print('type:', type(var_tuple))
print('value:', var_tuple)

最初の「var_tuple = 1,」では値が1のint型変数を定義しているようにも見えますが、末尾のカンマによってtuple型変数となります。0番目しか要素がないので変数の長さは1です。実行すると以下となります。

type: <class 'tuple'>
value: (1,)

int型変数ではないことが確認できますね。



Tupleにまつわる変数定義の注意点

変数を定義するとき、タイプミスで末尾にカンマをつけてしまって、思いがけずtuple型になってしまうことがあります。実際のプログラミングの場面で起こりやすいミスですが、プログラムがエラーとなっても原因に気づきにくく解決に時間がかかってしまいがちです。いくつか例を見て理解を深めましょう。



単一変数の場合 | int型変数の例

まずはint型変数の例を見ていきます。例えば、int型変数を使って足し算をしたいとします。以下を実行してみましょう。

# define an int variable
var1 = 1 # this is int

# see type and value
print(type(var1), var1)

# apply some arithmetic
var1 += 1 # 1 -> 2

# see type and value
print(type(var1), var1)

単純に1という値に1を足して2にするだけです。実行すると以下となります。

<class 'int'> 1
<class 'int'> 2



末尾のカンマでtuple型になることによるエラー

変数var1を定義するときにタイプミスでカンマを入れてしまうと、途中の計算でエラーになります。以下を実行してみましょう。

# define an int variable
var1 = 1, # this is TUPLE of an int

# see type and value
print(type(var1), var1)

# apply some arithmetic
var1 += 1 # ERROR

足し算のところでエラーになります。変数var1を定義するとき、末尾にカンマが入っているため変数var1はtuple型になってしまいます。tuple型変数にintを足すことはできないのでエラーになります。tuple型に+の演算をするとlist型同様、結合の意味になります(詳しくは過去記事「python入門講座 | List型の使い方3(要素の更新・追加、リストの結合の方法)」参照)。

上記の例を実行すると以下が表示されます。

<class 'tuple'> (1,)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/cc/zd_rdmgn14z8hw956cpfjt480000gn/T/ipykernel_50516/1279194690.py in <module>
      6 
      7 # apply some arithmetic
----> 8 var1 += 1 # ERROR

TypeError: can only concatenate tuple (not "int") to tuple

末尾にカンマが入ってtuple型になるミスは、int型のような単一変数の場合はすぐに発覚するのでエラーの原因を見つけやすいです。



配列タイプの変数の場合 | list型の例

List型など配列タイプの変数でこのミスをやってしまうこともあります。この場合、プログラムを実行してエラーが出たとき、どこに原因があるかすぐに見つけられないことがあるので厄介です。例えば、list型変数を定義し、その要素を変更することを考えます。以下を実行してみましょう。

# define a list variable
var1 = [1,3,5,7]

# see type, length, and value
print(type(var1), len(var1), var1)

# apply some arithmetic
var1[3] += 1 # 7 -> 8

# see type, length, and value
print(type(var1), len(var1), var1)

長さ4のlist型変数を定義し、3番目の要素(7)に1を足す処理を行います。これを実行すると以下となります。

<class 'list'> 4 [1, 3, 5, 7]
<class 'list'> 4 [1, 3, 5, 8]



末尾のカンマでtuple型になることによるエラー

変数var1を定義するときにタイプミスでカンマを入れてしまうと、途中の計算部分で3番目の要素を呼び出す際にエラーになります。以下を実行してください。

# define a list variable
var1 = [1,3,5,7], # this is not a list, but tuple of list

# see type, length, and value
print(type(var1), len(var1), var1)

# apply some arithmetic
var1[3] += 1 # ERROR

今度は変数を定義するとき、末尾にカンマがあります。変数var1はlist型ではなくtuple型になっています。実行すると以下が表示されます。

<class 'tuple'> 1 ([1, 3, 5, 7],)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/var/folders/cc/zd_rdmgn14z8hw956cpfjt480000gn/T/ipykernel_50516/4254680949.py in <module>
      6 
      7 # apply some arithmetic
----> 8 var1[3] += 1 # ERROR

IndexError: tuple index out of range

このエラーの「index out of range」という箇所だけ見ると、「3番目の要素var1[3]を参照しようとしてインデックスが大きすぎるというエラーが出ているのだから、var1の要素数が足りないために発生したエラー」だと誤認しやすいです。しかし実際には、var1は0番目の要素がlist型([1, 3, 5, 7])というtuple型変数(長さは1)となっているために、var1の3番目の要素が参照できないのです。”tuple” index out of rangeというところに注目すれば、listにしたはずの変数がtupleになってしまっていることに気づけるはずです。

以下を実行して、変数var1の長さが1で、0番目の要素がlistとなっていることを確認しましょう。

# check var1
print(len(var1))
print(var1[0])

実行すると以下となります。

1
[1, 3, 5, 7]

このように、定義したはずの配列タイプの変数のサイズがおかしいときには、余計なカンマによってその変数がtuple型になってしまっていないか確かめてみましょう。 今回の例は単純なので原因に気付きやすいです。しかし、複雑なプログラムではこのミスの原因を特定するだけで時間がかかってしまうことがあります。 この種類のミスが発生し得ることを知っておくだけで、プログラミングの効率化につながりますので覚えておきましょう。



豆知識: 複数変数の同時定義

本編とは関係のない内容ですが、カンマを使った変数定義に関するテクニックを紹介します。さきほど、カンマを使ってtuple型変数を定義しましたが、変数定義のとき、代入演算子(=)の左辺に右辺と同じ数だけ変数を置けば、複数の変数を同時に定義することができます。以下を実行してみましょう。

# define three variables
var1, var2, var3 = 1,2,3

# see its type and value
print('type-1:', type(var1))
print('value-1:', var1)

この場合、var1, var2, var3はtuple型ではなく、それぞれがint型変数として定義されます。3つの変数を1行で同時に定義できます。コードをシンプルにできるのでよく使うテクニックです。



Result | 練習問題

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

  1. tuple型変数var_tupleを丸括弧を使わずに作成してください。要素は以下です。
    • 値1: ‘dog’
    • 値2: ‘cat’
    • 値3: ‘mouse’
  2. print文で変数var_tupleの型と内容を出力してください。
  3. list型変数var_listを以下の値で定義し、型と内容を出力してください。
    • 値1: 1
    • 値2: 2
    • 値3: 3.14
  4. 変数var_listの2番目の要素(3.14)を2倍し、型と内容を出力してください。
  5. list型変数var_listを定義する際、末尾にカンマを入れてください。定義した変数の型と内容を出力してください。
  6. 変数var_listの2番目の要素(3.14)を2倍しようとするとエラーとなることを確認してください。



練習問題の回答例

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

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



Conclusion | まとめ

最後までご覧いただきありがとうございます!
今回はtuple型変数に関連する注意点を解説しました。変数を定義するとき、末尾に余計なカンマをつけてしまったがために思いがけないエラーが発生することはよくあります。プログラムコードが複雑になるとエラーの原因に気づくのに時間がかかります。この種類のミスを知っておくだけでも、実際のプログラミングの場面で役立ちますので覚えておきましょう!

以上「python入門講座 | tuple型の使い方3(タプル型にまつわる注意点)」でした!
またお会いしましょう!Ciao!



References | 参考

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

Pythonの参考教科書

モバイルバージョンを終了