主要な組み込みデータ型
Python 3では、以下の6つの標準的なデータ型が用意されています。
- Number:数値型
- String:文字列
- List:リスト
- Tuple:タプル
- Set:集合
- Dictionary:辞書
変更可能と変更不可能の違い
- 変更不可能型(3種):Number、String、Tuple
- 変更可能型(3種):List、Dictionary、Set
Number(数値型)
Python 3では、int、float、bool、complex(複素数)がサポートされています。
整数型は1種類のみで、intとして扱われます。Python 2に存在したlong型は廃止されています。
>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
isinstance()関数を使って型を確認することもできます:
>>> value = 42
>>> isinstance(value, int)
True
type()とisinstance()の違いは、継承関係における扱い方にあります。
type()は厳密な型比較を行い、子クラスは親クラスとは見なされません。isinstance()は継承関係を考慮し、子クラスは親クラスとして認識されます。
>>> class Parent: pass
>>> class Child(Parent): pass
>>> isinstance(Child(), Parent)
True
>>> type(Child()) == Parent
False
算術演算
>>> 8 + 3 # 加算
11
>>> 9.5 - 4 # 減算
5.5
>>> 6 * 7 # 乗算
42
>>> 10 / 3 # 常に浮動小数点を返す
3.3333333333333335
>>> 10 // 3 # 整数除算(商)
3
>>> 17 % 5 # 余り
2
>>> 2 ** 6 # 冪乗
64
String(文字列)
文字列はシングルクォート(')またはダブルクォート(")で囲みます。特殊文字のエスケープにはバックスラッシュ(\)を使います。
>>> text = 'Hello'
>>> print(text[0]) # 先頭文字
H
>>> print(text[-1]) # 末尾文字
o
>>> print(text[1:4]) # インデックス1から3まで
ell
バックスラッシュによるエスケープを無効にするには、プレフィックスrを付けることで「リテラル文字列」になります。
>>> print('Line1\nLine2')
Line1
Line2
>>> print(r'Line1\nLine2')
Line1\nLine2
複数行の文字列は、三重クォート("""...""" または '''...''')で記述できます。
Pythonでは文字型はなく、1文字の文字列も長さ1の文字列として扱われます。
文字列は不変(イミュータブル)であり、インデックスでの代入はエラーになります。
List(リスト)
リストは方括弧[ ]で囲み、要素はコンマで区切ります。異なる型の要素も含めることができます。
>>> items = ['apple', 42, 3.14, ['nested']]
>>> print(items[0])
apple
>>> print(items[1:3])
[42, 3.14]
>>> print(items + [100])
['apple', 42, 3.14, ['nested'], 100]
リストは変更可能です。要素の追加や削除、更新が可能。
Tuple(タプル)
タプルは円括弧( )で囲み、要素はカンマで区切ります。タプルは不変なので、要素の変更はできません。
>>> data = (1, 'hello', 3.14)
>>> print(data[0])
1
>>> print(data[1:])
('hello', 3.14)
タプルはリスト同様にスライシングや結合が可能ですが、要素の変更は不可。
Set(集合)
集合は中括弧{ }またはset()で作成します。重複する要素は自動的に除外されます。
>>> unique_items = {'a', 'b', 'c', 'a'}
>>> print(unique_items)
{'a', 'b', 'c'}
>>> set_a = set('hello')
>>> set_b = set('world')
>>> print(set_a - set_b) # 差集合
{'e', 'h'}
>>> print(set_a | set_b) # 和集合
{'e', 'h', 'l', 'r', 'o', 'w', 'd'}
>>> print(set_a & set_b) # 積集合
{'l', 'o'}
>>> print(set_a ^ set_b) # 排他的論理和
{'e', 'h', 'r', 'w', 'd'}
Dictionary(辞書)
辞書はキーと値のペアで構成され、{ }で定義します。キーは変更不可能な型でなければなりません。
>>> config = {'host': 'localhost', 'port': 8080}
>>> print(config['host'])
localhost
>>> config['debug'] = True
>>> print(config.keys())
dict_keys(['host', 'port', 'debug'])
>>> print(config.values())
dict_values(['localhost', 8080, True])
辞書は順序を持たないが、キーを通じて高速に値にアクセスできます。
メモリ上の変化の仕組み
データ型の「変更可能/不可能」は、変数の値が変更されたときにそのメモリ上のアドレスが変わるかどうかによって定義されます。
- 変更不可能型:値が変わると新しいメモリアドレスが割り当てられる。
- 変更可能型:値が変わっても同じメモリアドレスが維持される。