読み込み中...

Python初心者必見!type関数の使い方と活用術10選

Pythonのtype関数の使い方と活用術を詳解する記事のサムネイル Python
この記事は約24分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonで値の型を調べる場面では、type()isinstance()の違いを押さえると判断が安定します。type関数は対象オブジェクトの直接の型を返すため、初心者がデバッグや学習で変数の状態を確認するときに扱いやすい入口になります。ただし、継承関係を含めた判定ではisinstance()のほうが合うため、使い方を分けて理解する必要があるのが基本です。

この記事の対象は、Pythonの基礎文法を学習しながら型判定をコーディングに取り入れたい初心者です。プログラミングの教育現場でも、intstrlistdictなどを確認する練習は、エラー原因を切り分ける土台になるのが一般的です。活用例を通して、type関数の使い方を小さなコードから段階的に整理します。

動作確認環境
  • Python 3.14 系の公式ドキュメントを参照
  • 標準ライブラリのみを利用し、外部パッケージは不要
  • ターミナル、IDLE、VS Code などのPython実行環境で確認可能
📖 この記事で学べること
  • type()でオブジェクトの型を確認する基本
  • type関数isinstance()の使い分け
  • リスト、辞書、例外、入力値に対する型判定の活用例
  • 動的型付けにより変数の型が変わる場面への対処
  • type()を3引数で使い、クラスを動的に作る方法

公式ドキュメントで仕様を確認する場合は、Python公式ドキュメントのtypeと、Python公式ドキュメントのisinstanceが一次情報になります。基本文法を広く確認したい場合は、内部記事のPython初心者のための完全ガイド!アプリ化の10ステップも補助になります。

Pythonとは

Pythonは、読みやすい構文と豊富な標準ライブラリを備えた汎用プログラミング言語です。Web開発、データ処理、自動化、教育用途まで使われる範囲が広く、初心者の学習にも採用されやすい言語と言えますが、これは押さえたい点です。そのため、型や関数の使い方を早い段階で整理しておくと、後のコーディングが読みやすくなります。

一般に、Pythonは変数へ値を代入するときに型名を明示しません。x = 10と書けばxは整数を参照し、x = 'text'と書き換えれば文字列を参照します。この動的型付けの性質があるため、処理中の値がどの型かを確認するtype関数の役割が見えてきますし、これが一つの目安です。

Pythonの特徴

Pythonのコードは、iffordefclassなどの構文が比較的読みやすく、処理の流れを追いやすい設計です。一方、変数の型は実行時の値で決まるため、関数に渡した引数が想定と違う型になることもあります。その確認にprint()type()を組み合わせる方法がよく使われます。

具体的には、数値計算ではintfloat、テキスト処理ではstr、複数データの保持ではlistdictが登場するのが現実的です。これらの型を意識すると、データ分析やWeb開発だけでなく、ファイル操作や入力処理のプログラミングでもミスを見つけやすくなります。表データの処理に進む前なら、初心者必見!Pythonで表を操作するための7つの詳細ガイドを合わせて読むと理解がつながりますし、ここがポイントです。

場面確認する型使う関数判断の目安
整数の確認inttype()直接の型を見たいとき
文字列の確認strtype()入力値や表示値を調べるとき
リストの確認listtype()複数値のまとまりを調べるとき
辞書の確認dicttype()キーと値を持つデータを扱うとき
継承込みの判定親クラスと子クラスisinstance()サブクラスも許容したいとき
例外の分類Exceptiontype()ログや分岐の材料にするとき
動的クラス作成typetype(name, bases, dict)実行時にクラスを組み立てるとき

type関数とは

type関数は、引数に渡したオブジェクトの型を返す組み込み関数です。公式ドキュメントによれば、引数が1個のtype(object)は対象の型を返し、引数が3個のtype(name, bases, dict)は新しいクラスを作成します。この二面性を知ると、単なる型確認だけでなく、Pythonのクラス構造への理解にもつながります。

type関数の基本

基本の使い方はtype(オブジェクト)です。戻り値は<class 'int'>のようなクラスオブジェクトであり、文字列ではありません。そのため、判定に使う場合はtype(value) is intのように型そのものと比較すると整理できます。

ただし、boolintのサブクラスであるなど、Pythonの型には継承関係があります。直接の型だけを見たいならtype関数、継承を含めた判定をしたいならisinstance()と整理すると、初心者でも混乱しにくくなります。クラスの基本を確認したい場合は、Python公式チュートリアルのClassesが参考になるのが目安です。

type関数の使い方

結論として、値の型を見たいだけならprint(type(x))で十分です。次の最小コードでは、整数を代入した変数xに対してtype関数を呼び出し、期待される出力としてintのクラスが表示されますが、覚えておくと役立つでしょう。

type関数の詳細な使い方

このとき、xは値10を参照しており、Pythonはその値を整数として扱います。print()type(x)を渡すと、型オブジェクトの表示形式が標準出力へ送られます。

x = 10
print(type(x))

結果: 期待される出力は<class 'int'>です。

その出力例をコードブロックだけで表すと、次のようになると理解できます。実際のコーディングでは出力部分をそのまま入力するのではなく、結果の読み取り方として確認します。

<class 'int'>

結果: 期待される出力例として、xの直接の型がintであることを示します。

type関数のサンプルコード1

文字列に対しても、使い方は整数の場合と同じです。y'Python'を代入すると、type(y)strクラスを返すると覚えるとよいでしょう。

y = "Python"
print(type(y))

結果: 期待される出力は<class 'str'>です。

その表示は、文字列を扱う処理で入力値や変換後の値を確認するときに役立ちます。初心者の学習では、input()の戻り値が常にstrになる点と合わせて覚えるとよいです。

<class 'str'>

結果: 期待される出力例として、yが文字列型であることを示します。

type関数のサンプルコード2

リストを調べる場合も、type関数の呼び出し方は変わりません。z[1, 2, 3]を代入すると、Pythonは複数の要素を持つリストとして扱いると考えられます。

z = [1, 2, 3]
print(type(z))

結果: 期待される出力は<class 'list'>です。

この確認は、リスト内包表記やappend()を使う前に、対象が本当にリストかを見分ける材料になります。型の確認を習慣化すると、データ構造を誤って扱うエラーを早めに切り分けられます。

<class 'list'>

結果: 期待される出力例として、zの型がlistであることを示すると言えるでしょう。

type関数の活用例

type関数の活用例は、デバッグ、入力検証、辞書データの分類、例外ログ、動的クラス作成などに広がります。Pythonのプログラミングでは値の形が処理の分岐に直結するため、型を確認するコーディングは教育用途でも実務寄りの学習でも扱われます。ここからの活用例では、type()isinstance()を混ぜながら、適した使い方を確認するのがポイントです。

💡 Tips: 直接の型だけを厳密に見るならtype(value) is int、サブクラスも含めたいならisinstance(value, int)を使うと整理しやすくなるのが基本です。

活用例1のサンプルコード

データの型ごとにメッセージを変える例です。handle_data()は引数dataを受け取り、intstr、それ以外で分岐します。

def handle_data(data):
    if type(data) is int:
        print(f"あなたのデータは整数型です。値は{data}です。")
    elif type(data) is str:
        print(f"あなたのデータは文字列型です。値は'{data}'です。")
    else:
        print("未知のデータ型です。")

handle_data(10)
handle_data("Python")
handle_data(3.14)

結果: 期待される出力は、整数、文字列、その他の型に応じた3行のメッセージです。

この活用例では、float3.14がどの条件にも一致しないため、未知のデータ型として扱われます。厳密な型一致を示す教育用コードとしては読みやすい一方、数値全体を許容したい場合はisinstance(data, (int, float))が向いています。

あなたのデータは整数型です。値は10です。
あなたのデータは文字列型です。値は'Python'です。
未知のデータ型です。

結果: 期待される出力例として、10'Python'3.14に異なる分岐が適用されますし、ここを基本と考えるとよいでしょう。

活用例2のサンプルコード

クラスのインスタンスを判定する例では、classで定義した型とtype()の戻り値を比較します。オブジェクト指向プログラミングの学習では、インスタンスがどのクラスから作られたかを確認する練習になります。

class MyClass:
    pass

class YourClass:
    pass

def identify_class(instance):
    if type(instance) is MyClass:
        print("このインスタンスはMyClassから生成されました。")
    elif type(instance) is YourClass:
        print("このインスタンスはYourClassから生成されました。")
    else:
        print("このインスタンスは未知のクラスから生成されました。")

instance1 = MyClass()
instance2 = YourClass()
identify_class(instance1)
identify_class(instance2)
identify_class(10)

結果: 期待される出力は、MyClassYourClass、未知のクラスを示す3行です。

このコードでは、instance1instance2がそれぞれ別のクラスから生成されます。一方、10intの値なので、どちらのクラスにも一致しません。

このインスタンスはMyClassから生成されました。
このインスタンスはYourClassから生成されました。
このインスタンスは未知のクラスから生成されました。

結果: 期待される出力例として、渡したオブジェクトの直接の型に応じて分岐します。

活用例3のサンプルコード

型が混ざったリストを分類する活用例です。mixed_listを走査し、append()で型ごとのリストへ振り分けますし、ここがポイントです。

mixed_list = [1, "Python", 3.14, [1, 2, 3], {"name": "John"}]
int_list = []
str_list = []
float_list = []
list_list = []
dict_list = []

for item in mixed_list:
    if type(item) is int:
        int_list.append(item)
    elif type(item) is str:
        str_list.append(item)
    elif type(item) is float:
        float_list.append(item)
    elif type(item) is list:
        list_list.append(item)
    elif type(item) is dict:
        dict_list.append(item)

print("整数リスト:", int_list)
print("文字列リスト:", str_list)
print("浮動小数点数リスト:", float_list)
print("リストリスト:", list_list)
print("辞書リスト:", dict_list)

結果: 期待される出力は、整数、文字列、浮動小数点数、リスト、辞書に分かれた各リストです。

このパターンは、外部ファイルやAPIから得たデータを確認する前処理に近い考え方です。データ分析へ進む場合は、型ごとの分類を理解してから、Pythonで折れ線グラフ作成の完全ガイド10選のような可視化処理に進むと学習の流れが作りやすくなります。

整数リスト: [1]
文字列リスト: ['Python']
浮動小数点数リスト: [3.14]
リストリスト: [[1, 2, 3]]
辞書リスト: [{'name': 'John'}]

結果: 期待される出力例として、mixed_list内の要素が型別に格納されます。

活用例4のサンプルコード

自作クラスのインスタンスかどうかを確認する活用例です。__init__()で名前を受け取り、生成後にtype(my_instance) is MyClassで直接の型を見ますが、これは押さえたい点です。

class MyClass:
    def __init__(self, name):
        self.name = name

my_instance = MyClass("John")

if type(my_instance) is MyClass:
    print("my_instanceはMyClassのインスタンスです。")
else:
    print("my_instanceはMyClassのインスタンスではありません。")

結果: 期待される出力は、my_instanceMyClassのインスタンスであることを示す文です。

この書き方は、特定クラスだけに処理を限定したいときに使えます。ただし、MyClassを継承した子クラスも許容したい設計なら、isinstance(my_instance, MyClass)を選ぶほうが自然です。

my_instanceはMyClassのインスタンスです。

結果: 期待される出力例として、生成したインスタンスの直接の型が一致します。

活用例5のサンプルコード

例外処理では、発生した例外オブジェクトの型を確認できるのが目安です。tryブロックで起きた例外をexcept Exception as eで受け取り、type(e)を表示します。

try:
    # ゼロ除算エラーを引き起こす
    result = 1 / 0
except Exception as e:
    exception_type = type(e)
    print("発生した例外のタイプ:", exception_type)

結果: 期待される出力は、発生した例外の型がZeroDivisionErrorであることを示す行です。

この方法はログ出力やエラー分類の学習に向いています。より実用的なコーディングでは、except ZeroDivisionErrorのように例外型を明示して捕捉する設計も検討するのがポイントです。

発生した例外のタイプ: <class 'ZeroDivisionError'>

結果: 期待される出力例として、1 / 0により発生する例外型が表示されます。

活用例6のサンプルコード

複数の変数をまとめて確認する場合は、変数をリストへ入れてforで回すと簡潔です。variablesの各要素に対してtype関数を呼ぶため、同じ処理を何度も書かずに済みます。

# 変数を定義
var1 = 10
var2 = "Hello, Python!"
var3 = [1, 2, 3, 4, 5]
var4 = {"name": "Python", "version": 3.9}

# 各変数の型を確認
variables = [var1, var2, var3, var4]
for v in variables:
    print(type(v))

結果: 期待される出力は、intstrlistdictを示す4行です。

この活用例は、デバッグ中に変数の状態を一覧したいときに使えます。print()を一時的に使う方法に慣れたら、必要に応じてloggingへ置き換えると保守しやすくなります。

<class 'int'>
<class 'str'>
<class 'list'>
<class 'dict'>

結果: 期待される出力例として、変数ごとの型が順番に表示されますし、これが一つの目安です。

活用例7のサンプルコード

数値かどうかを判定する処理では、type()よりisinstance()が合う場合があります。intfloatの両方を許容したいなら、(int, float)のタプルで指定できます。

def check_number(value):
    if not isinstance(value, (int, float)):
        raise ValueError("数値型を入力してください。")
    else:
        print(f"{value}は数値です。")

# 正しい型の変数
check_number(10)

# 間違った型の変数
check_number("Hello, Python!")

結果: 期待される出力は、最初に数値である旨を表示し、その後ValueErrorが発生する流れです。

このコードは、入力値の検証を学ぶための短い例です。例外が発生した後も処理を続けたい場合は、呼び出し側でtryexcept ValueErrorを組み合わせます。

10は数値です。
ValueError: 数値型を入力してください。

結果: 期待される出力例として、文字列を渡した時点で数値型ではないことが示されます。

活用例8のサンプルコード

特定の型だけを抽出する場合は、リスト内包表記とisinstance()を組み合わせると短く書けるのが一般的です。filter_type()は対象リストと抽出したい型を受け取り、条件に合う要素だけを返します。

def filter_type(target_list, target_type):
    return [item for item in target_list if isinstance(item, target_type)]

mixed_list = [1, "Python", 3.14, [1, 2, 3], {"name": "Python"}]
filtered_list = filter_type(mixed_list, str)
print(filtered_list)

結果: 期待される出力は、文字列だけを含むリスト['Python']です。

この使い方は、データの前処理や検索条件の分離で応用できます。文字列を整形する処理へつなげる場合は、Pythonで改行あり・なしを制御する方法と応用例10選も関連する内容になります。

['Python']

結果: 期待される出力例として、mixed_listからstr型の要素だけが抽出されますが、覚えておくと役立つでしょう。

活用例9のサンプルコード

辞書の値を型ごとに処理する例です。dictionary.items()でキーと値を取り出し、値がstrint、その他のどれかで分岐します。

def process_values(dictionary):
    for key, value in dictionary.items():
        if isinstance(value, str):
            print(f"Key: {key}, Value: {value}, is a string.")
        elif isinstance(value, int):
            print(f"Key: {key}, Value: {value}, is an integer.")
        else:
            print(f"Key: {key}, Value: {value}, is of another type.")

sample_dict = {"name": "Python", "version": 3, "modules": ["os", "sys", "re"]}
process_values(sample_dict)

結果: 期待される出力は、辞書の各値について文字列、整数、その他を示す3行です。

この活用例は、JSON相当のデータをPythonのdictとして扱うときに考え方が近くなります。値の型に応じて検証や変換を分けると、後続処理で想定外の型にぶつかる可能性を下げられます。

Key: name, Value: Python, is a string.
Key: version, Value: 3, is an integer.
Key: modules, Value: ['os', 'sys', 're'], is of another type.

結果: 期待される出力例として、nameversionmodulesの値が型別に判定されますし、ここを基本と考えるとよいでしょう。

活用例10のサンプルコード

ユーザー入力を検証する例では、input()の戻り値が文字列である点を前提にします。数値として扱いたい場合は、int()で変換し、失敗した場合にValueErrorを捕捉します。

def get_user_input():
    user_input = input("Please enter a number: ")
    if isinstance(user_input, str):
        try:
            user_input = int(user_input)
            print(f"You have entered number: {user_input}.")
        except ValueError:
            print("You have not entered a number. Please try again.")

get_user_input()

結果: 期待される表示は、入力が数値文字列なら変換後の数値、数値以外ならエラーメッセージです。

このコーディングでは、isinstance(user_input, str)の判定は常に真になりやすい点に注意します。input()の戻り値は文字列なので、実際の検証の中心はint(user_input)が成功するかどうかです。

Please enter a number: 5
You have entered number: 5.

結果: 期待される表示例として、ユーザーが5を入力した場合は数値へ変換された値が表示されます。

Please enter a number: hello
You have not entered a number. Please try again.

結果: 期待される表示例として、ユーザーがhelloを入力した場合は変換失敗のメッセージが表示されますし、ここがポイントです。

入力検証は、GUIや自動化スクリプトにもつながる考え方です。ウィンドウ操作など別の自動化へ進む場合は、Pythonで実現!ウィンドウ操作の自動化15選で処理の組み立て方を確認できます。

type関数の注意点と対処法

type関数を使うときに特に押さえたいのは、直接の型を返す点です。親クラスと子クラスの関係を含めて判定したい場合、type(child) is ParentClassでは期待と違う結果になることがあります。そのため、継承を含める判定ではisinstance()を使うのが一般的です。

⚠️ 注意: type()は直接の型を返するのが現実的です。サブクラスを親クラスとして扱いたい判定では、isinstance()を使うほうが意図に合います。

次のコードでは、ChildClassParentClassを継承しています。type(child_instance) is ParentClassは直接の型が違うため偽になり、isinstance(child_instance, ParentClass)は継承関係を見て真になると整理できます。

class ParentClass:
    pass

class ChildClass(ParentClass):
    pass

child_instance = ChildClass()

print(type(child_instance) is ParentClass)  # False
print(isinstance(child_instance, ParentClass))  # True

結果: 期待される出力は、1行目がFalse、2行目がTrueです。

この違いは、Pythonの型判定で初心者がつまずきやすい部分です。厳密なクラス一致を見たいならtype()、継承を含む自然な判定をしたいならisinstance()という基準で使い分けると、設計意図が読み取りやすくなります。

一方、Pythonは動的型付けの言語なので、同じ変数名でも参照する値が変われば型も変わります。変数名ではなく、その時点で変数が参照しているオブジェクトに型があると理解すると整理できると理解できます。

def dynamic_typing_example():
    x = 10
    print(type(x))  # <class 'int'>

    x = 'hello'
    print(type(x))  # <class 'str'>

dynamic_typing_example()

結果: 期待される出力は、最初に<class 'int'>、代入後に<class 'str'>です。

その性質により、type関数で確認した結果は確認した時点の情報になります。関数の入口、変換処理の直後、外部入力を受け取った直後など、型が変わりやすい場所で確認すると原因を追いやすくなります。

ℹ️ 補足: 型チェックを増やしすぎると、Pythonらしい柔軟な設計を妨げる場合があると覚えるとよいでしょう。公開関数の入口や外部データの受け取り口など、境界部分に絞ると読みやすいコードになります。

type関数のカスタマイズ方法

type()は1引数で型を返すだけでなく、3引数で新しいクラスを動的に作れます。形式はtype(name, bases, dict)で、nameがクラス名、basesが親クラスのタプル、dictが属性やメソッドの辞書です。この使い方は高度ですが、Pythonのクラスがオブジェクトとして扱われることを理解する材料になると考えられます。

ただし、通常のアプリケーション開発ではclass MyClass:の構文で十分な場面が大半です。3引数のtype関数は、フレームワークやメタプログラミング、動的なモデル生成などで検討されます。初心者の学習では、仕組みの理解を目的に小さく試す位置づけが適しています。

MyClass = type('MyClass', (), {})

my_instance = MyClass()

print(type(my_instance))  # <class '__main__.MyClass'>

結果: 期待される出力は、動的に作成したMyClassのインスタンス型を示す表示です。

このコードでは、type('MyClass', (), {})によって空の親クラス指定と空の属性辞書を持つクラスを作成していると言えるでしょう。作成したMyClassを通常のクラスと同じように呼び出すと、my_instanceが生成されます。

そのクラスへメソッドを持たせる場合は、属性辞書に関数を入れます。selfを受け取る関数を辞書へ渡すと、生成されたクラスのインスタンスメソッドとして呼び出せますが、これは押さえたい点です。

def my_method(self):
    print('This is my method.')

MyClassWithMethod = type('MyClassWithMethod', (), {'my_method': my_method})

my_instance = MyClassWithMethod()
my_instance.my_method()  # This is my method.

結果: 期待される出力は、This is my method.というメッセージです。

このような動的クラス作成は、教育目的ではPythonの型システムを理解する助けになります。一方、通常のコーディングでは可読性が下がりやすいため、明確な理由がなければclass文を使うほうが保守しやすいです。より深く調べる場合は、Python公式ドキュメントのtypesモジュールも確認できます。

まとめ

Pythonのtype関数は、オブジェクトの直接の型を確認するための組み込み関数です。type(x)の形で値を渡すだけなので、初心者の学習やデバッグで使いやすく、intstrlistdictなどの型を確認する入口になるのが基本です。

ただし、継承関係を含めて判定したい場合はisinstance()を選びます。type()は直接の型、isinstance()は指定クラスやサブクラスを含む判定と整理すると、プログラミング中の意図がコードに表れます。

活用例では、値の分類、インスタンス判定、リストのフィルタリング、辞書処理、例外処理、入力検証を扱いました。これらの使い方は、コーディングの途中で値の状態を確認し、想定外の型によるエラーを早く見つける助けになるのが目安です。

一方、3引数のtype関数を使うと、実行時にクラスを作成できます。通常の開発ではclass文が読みやすいものの、動的な型作成の仕組みを知ることは、Pythonの型システムやメタプログラミングを学習する足がかりになります。

そのため、日常的な使い方ではprint(type(value))で確認し、条件分岐ではtype(value) is SomeClassisinstance(value, SomeClass)を目的に応じて選びますし、これが一つの目安です。教育用の小さなコードから始め、データ処理や入力検証へ広げると、Pythonの型に対する理解が実践に結びつきます。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。