はじめに
近年の静的型付け言語の流行に伴い、Pythonでコードを書く際に静的型付け言語のように型安全な書き方を記載することが求められるようになってきました。実際にPython3においてversionが上がる度に型ヒントに関する機能が充実するようになってきました。
今回はPythonにおける型の種類をまとめました。
※因みにPythonはすべてがオブジェクトなので、Pythonにおける型とはオブジェクトの種類(type)のこと。ここではtype()の戻り値のクラスを型と呼びます。
Python実行環境は Python 3.9.6
Pythonに備わっている組み込み型(Built-in Types)
組み込み型は主に下記が存在します。(公式ドキュメントから抜粋)
1, 数値型(整数、浮動小数点数、複素数、真偽値)
2, シーケンス(リスト、タプル、rangeオブジェクト)
3, テキストシーケンス(文字列)
4, 集合型(set, frozenset)
5, マッピング(辞書)
6, バイナリシーケンス
7, コンテキストマネージャー型
8, その他組み込み型(クラス、インスタンス、例外、モジュール、型オブジェクト、nullオブジェクト、Ellipsis オブジェクト、NotImplemented オブジェクト)
※6,7,8は今回は扱わない。
1, 数値型 --- int, float, complex, bool
int:整数。精度の制限はない。
float:浮動小数点数
complex:複素数
bool:整数のサブタイプで、偽値として 0 または False を返し、真値として 1 または True を返します。
数値型はコンストラクタ int() 、 float() 、 complex() を使ってそれぞれ生成可能です。
# 数値データの値と型の例
type(1) # <class 'int'>
type(1.0) # <class 'float'>
type(1.0 + 2j) # <class 'complex'>
str(1) # 1
float(1) # 1.0
complex(1) # (1+0j)
2, シーケンス型 --- list, tuple, rangeオブジェクト
コレクション(※1)のうちで、集約する要素が一定の順序で並んでいて、その順序(インデックス)を使ってその要素を指定できる種類のオブジェクトです。
(※1)コレクション(コンテナ):複数の値や要素をまとめて管理可能なデータ型。リスト、タプル、辞書、集合などのこと
list([iterable])
リストはミュータブルなシーケンスで、主に要素はたいてい同じ型のデータを格納するために使用される
リストは 可変 で、であり、たいていイテレートによってアクセスします。
因みに配列の中でも要素が数値のものを数値配列、要素が文字列のものを文字列配列などと呼ぶことがあります。
配列はlist([iterable])で生成が可能です。
# 配列データ作成例
list('abc') ⇒ ['a', 'b', 'c']
list( (1, 2, 3) ) ⇒ [1, 2, 3]
tupple([iterable])
タプルはイミュータブルなシーケンスで、一般的に複数の型のデータを格納するために使用されます。
要素はアンパック操作やインデックスでアクセスすることが多いです。一般にタプルとリストは利用用途が異なります。
タプルはtuple()で作成可能です。
# タプルデータ作成例
tuple('abc') # ('a', 'b', 'c')
tuple([1, 2, 3]) # (1, 2, 3)
また、関数の戻り値が複数ある場合に、戻り値は1変数に格納するとtuppleになります。
def func():
json_data = {'ID': 1, 'NAME': 'うどん'}
return_code = 0
return return_code, json_data
ret = func()
print(ret) # (0, {'ID': 1, 'NAME': 'うどん'})
print(type(ret)) # <class 'tuple'>
range(start, stop[, step])
数値のイミュータブルなシーケンス
start: この引数が与えられていない場合は 0
step: この引数が与えられていない場合は 1
range 型が通常の list や tuple にまさる点は、range オブジェクトがサイズや表す範囲にかかわらず常に一定の (小さな) 量のメモリを使うことです。
また、等価なrangeオブジェクト同士が、異なるstart, stop および step属性を持つことがあります。
# rangeオブジェクトの等価性比較例
range(0) == range(2, 1, 3) # True
range(0, 3, 2) == range(0, 4, 2) # True
3, テキストシーケンス型 --- str
いわゆる文字列のこと。
Unicode コードポイントでイミュータブルです。
さらに、文字列は他のオブジェクトに str()を使うことでも生成可能です。
テキストシーケンス型データはstr()で生成可能
4, 集合型 --- set, frozenset
固有の hashable オブジェクトの順序なしコレクションで重複する要素をもたない、順序づけ不可な要素の集まりです。
和・積・差・対称差の演算が可能です。
コレクションには順序がないので、集合は挿入の順序や要素の位置を記録しない。そのため、集合はインデクシング、スライシング等の操作はできません。
空集合を作成するためには set() でないといけません。因みに{} は空の辞書になります。
# 集合型データの作成方法
set([iterable]) # ミュータブル。add() remove()などのメソッドを使って内容変更可能。
frozenset([iterable]) # イミュータブル。一度定義すると内容変更不可能。
# 集合型データの作成例(見やすくするためコーディング規約は無視)
set('foofoo1') # {'o', 'f', '1'}
set(['a', 'b', 'c']) # {'c', 'b', 'a'}
frozenset('abc') # frozenset({'c', 'b', 'a'})
frozenset({'aaa', 'bbb', 'ccc', 'aaa'}) # frozenset({'ccc', 'aaa', 'bbb'})
5, マッピング型 --- dict
マッピングはミュータブルなオブジェクトです。キーは変更不可であり、辞書の中で一意でないといけません。
# 辞書型データはdict()で生成可能方法
dict(**kwargs)
dict(mapping, **kwargs)
dict(iterable, **kwargs)
# 辞書型データの作成例(見やすくするためコーディング規約は無視)
dict(A=1, B=2, C=3) # {'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 2, 'C': 3} # {'A': 1, 'B': 2, 'C': 3}
dict([('A', 2), ('B', 1), ('C', 3)]) # {'A': 1, 'B': 2, 'C': 3}
dict({'A': 1, 'C': 3}, B=2) # {'A': 1, 'C': 3, 'B': 2}
{'C': 3, 'A': 1, 'B': 2} # {'C': 3, 'A': 1, 'B': 2}
# 上記辞書はすべて等価
print(d1 == d2 == d3 == d4 == d5) # True