Pythonでコードを書いていると、変数の型を調べる必要が出てくるケースが多々あります。そこで、ここではPythonの変数の型を調べる方法を解説します。その方法として具体的には、type関数とisinstance関数がありますが、まずはtype関数をしっかりとマスターしましょう。
それでは解説を始めます。
1. 変数の型とは
変数の「型」とは、その変数に代入されているデータのタイプのことです。
『Pythonの変数の定義(変数宣言)の方法と命名規則』で解説している通り、変数とは、ある特定のデータが入っている箱のようなものでしたね。
上図では、textという変数名がつけられた箱に’これは文字列です。’という文字列が入っています。そしてnumberという変数名がつけられた箱に100という整数が入っています。
つまり、変数textの型は文字列型で、変数numberの型は整数型です。
それでは、なぜ変数の型を知ることが重要なのでしょうか。それは、型の種類によっては、同じ操作でもエラーになる場合があるからです。簡単な例を見てみましょう。
まず、次の4つの変数をつくります。
'''以下の4つの変数を作ります。'''
text_a = 'これは文字列です。'
text_b = 'これも文字列です。'
num_a = 100
num_b = 200
text_aとtext_bは文字列データが入っているので文字列型の変数です。num_aとnum_bは整数が入っているので数値型(整数型)の変数です。同じ型の変数だと、次のように+演算子で連結することができます。
'''同じ型の変数同士は連結することができます。'''
print(text_a + text_b)
print(num_a + num_b)
しかし、型が違う変数同士で+演算子で連結しようとするとエラーになります。
'''しかし文字列型変数と整数型変数を連結するとエラーになります。'''
print(text_a + num_a)
エラー結果を見てみるとTypeErrotと表示されていることがわかりますね。TypeErrorはデータの型が原因で起きるエラーです。このような時に、型の調べかたを知っていると、「あっ、データ型が間違えているんだな。型を調べてみよう」とエラーの原因の解明と解決ができるようになるのです。プログラムを書いていると、このようなケースは多々あります。
これはほんの一例に過ぎませんが、変数の型を理解し、その調べ方を知っておくことの意義はおわかりいただけたかと思います。
それでは、早速、変数の型を調べる方法を見ていきましょう。
2. type関数で変数の型を調べる
type関数を使うと変数の型をすぐに調べることができます。書式は次の通りです。
type(型を調べたい変数)
このようにtype関数の括弧()の中に、型を調べたい変数を入れると、型を返してくれます。
関数の括弧()の中の値を「引数(ひきすう)」といいます。そして、引数に変数を書くことを「関数の引数に変数を渡す」といいます。そして、関数から出力される値のことを「返り値」または「戻り値」といいます・
それでは、type関数を実際に見てみましょう。
以下のコードは、type関数の引数に文字列を代入した変数を渡しています。
text = "これは文字列です。"
type(text)
‘str’と返ってきましたね。これは’string’の略で、変数が文字列型であることを示します。
次のコードは、type関数の引数に数値を代入した変数を渡しています。
num = 100
type(num)
‘int’と返ってきましたね。これは’integer’の略で、変数が整数型であることを示します。
Pythonにはさまざまなタイプのデータ型があります。以下のコードで一気に見てみましょう。
'''さまざまなデータが代入された変数を作ります。'''
text = 'これは文字列です。' #文字列
int = 100 #整数
float = 0.123 #浮動小数点数
list = ['ばなな', 'りんご', 'みかん']#リスト
tuple = ('レタス', 'キャベツ', 'セロリ') #タプル
dict = {'key1': 'マイクロソフト', 'key2':'アップル'} #辞書
set = {"mac only", "both"} #集合
'''それぞれtype関数で肩を調べてみましょう。'''
print(type(text))
print(type(int))
print(type(float))
print(type(list))
print(type(tuple))
print(type(dict))
print(type(set))
まず、返り値について混乱のないように解説しておきます。先ほどまで、type関数の戻り値は’str’や’int’となっていました。今回は、<class ‘str’>というように返ってきています。
理由は、今回はtype関数をprint関数の中に入れてprint(type(変数))としているからです。なぜ、こうしたかというと、type関数の実行結果を一覧で並べたかったからです。これだけの理由です。なおprint関数については『Pythonのprintの書式と使い方の具体例』をご確認ください。
さて、出力結果を見てみると、
- str :文字列型
- int :整数型
- float :浮動小数点数型
- list :リスト型
- tupe :タプル型
- dict :辞書型
- set :集合型
と、それぞれ変数のデータの型が正しく返ってきていることがわかります。なお、データ型はほかにもありますが、現時点では、これぐらい知っておけば十分です。ほかのデータ型は学習を進めていくうちに自然と知っていくことになるでしょう。
3. isinstance関数で変数の型を調べる
型を調べる関数には、もう一つisinstance関数があります。
なお、ここからは初心者向けのものではないので、初心者の方は現段階では読み飛ばしていただいて構いません。オブジェクト指向プログラミングの「Pythonのクラス」について学習してから戻ってきていただければ理解できるようになっているでしょう。
それでは、isinstance関数について解説します。基本書式は次の通りです。
isinstance(型を調べたいオブジェクト, クラス)
「オブジェクト」は変数やデータとほとんど同義です。また「クラス」は型とほとんど同義です。現時点では、難しく考えないようにしてください。
isinstace関数は下図のように、第一引数に渡したオブジェクト(=変数)と、第二引数に渡したクラス名(=型)が一致するかどうかをブール値(True or False)で返します。
例えば、次のコードでは、第一引数に整数型変数を渡して、第二引数に整数型を表すintを渡しています。結果、変数と型が一致しているのでTrueと出力されていますね。
num = 100
isinstance(num, int)
次のコードでは、第一引数に整数型変数を渡して、第二引数に文字列型を示すstrを渡しています。結果、変数と型が一致していないのでFalseと出力されています。
num = 100
isinstance(num, str)
一見するとtype関数の方がisinstance関数よりシンプルで便利に見えますが、両者はうまく使いわけることができます。
以下のコードをご覧ください。
なお、この内容は『Pythonのオブジェクト指向プログラミングの知識と書き方まとめ』と『Pythonのクラス(class)の使い方まとめ | オブジェクト指向入門』の学習の後で理解できるようになりますので、そこまで終わっていない場合は、まだ理解できなくても全く問題ありません。「こんなものがあるんだな」ぐらいに考えてください。
'''スーパークラスとサブクラスを使います。(クラス=型とお考えください)'''
class Superclass(object):
pass
class Subclass(Superclass): #スーパークラスを継承したサブクラス
pass
'''サブクラスのインスタンスを作ります。(インスタンス=変数とお考えください)'''
instance = Subclass()
'''インスタンスのデータ型はサブクラスです。'''
print(type(instance))
'''サブクラスはスーパークラスを継承しているためどちらもTrueになります。'''
print(isinstance(instance, Subclass))
print(isinstance(instance, Superclass))
それでは解説します。
このコードでは、instanceはSubclassというクラス(型)のインスタンス(変数)です。確認のため、変数instanceをtype関数に渡すと、それはSubclass型のデータですよと返していますね。そのため、isinstance関数で、変数instanceかSubclassの変数かどうかを確認するとTrueと返ってくるのも当然ですね。
しかし、isinstance関数で、変数instanceが、Superclassの変数かどうかを確認すると、またTrueと返ってきています。これは、Subclassは、Superclassを継承していることを示しているのです。
つまり、isinstance関数では、type関数ではわからないクラスの親子関係(継承関係)まで確認することができるのです。プログラミングの学習が深まって、オブジェクト指向プログラミングを行うようになると、isinstance関数が必須になっていきます。
Python初心者の方は、こうしたことが難しいと感じて、もしかしたら勇気を挫かれるかもしれません。しかし誰もが通る道ですし、学習しながらコードを書いていると、自然と理解できるようになっているものです。
手を動かしながら学習すれば、実際はまったく難しいことが体感できるようになっていきますので、まったく不安に思う必要はありません。
コメント