はじめに
🐍Pythonのデータ型について基本的な事をまとめてみました。
この記事でわかる・できること
- 型とはなんなのか、どんな種類の型があるのか
- Javaとの比較
この記事の対象者
- Pythonを学習し始めた人
動作環境・使用するツールや言語
- 言語
- Python 3.11.9
- 環境
- Visual Studio Code
基本的な型について(str, int, float, list, dict, set, tuple, bool)
データ型とは、コンピューターがデータをどのように扱うかを決める仕組みです。人間は「1」と「こんにちは」を見て数字と文字だと見分けることができますがコンピューターはそういきません。
さっそく基本的な型であるこの8つの型をPythonとVisual Studio Codeを使って確認していきます。
確認にはtype()を利用します。これを利用すると引数に指定した変数などのオブジェクトのデータ型を返します。
str(文字列型)
- 文字列(テキスト)を表すデータ型です。イミュータブル(変更不可)で、たとえば text[0] = "H" のように文字列の一部を変更しようとするとエラーになります。変更したい場合は、新しい文字列を作る必要があります。
- 定義方法:""(ダブルクォーテーション)または ''(シングルクォーテーション)で囲みます。
- 例:"test", "こんにちは", "123" (数字も文字列として扱われます。)
text = "test"
print(type(text)) # <class 'str'>
int(整数型)
- 小数点を含まない整数を表すデータ型です。Pythonの整数はメモリが許す限り桁数に制限がありません。
Javaでは2の31乗(±2³¹)-2,147,483,648 ~ 2,147,483,647となりこれより大きな整数を扱いたい場合はlong(2の63乗)を使います。 - 定義方法:数値をそのまま書きます。
- 例:0, 100, -999
test = 1
print(type(test)) # <class 'int'>
float(浮動小数点型)
- 小数点を含む数値を表すデータ型です。
- 定義方法:小数点を含めて数値を書きます。
- 例:1.0, -2.718, 0.0
test = 3.14
print(type(test)) # <class 'float'>
list(リスト型)
- 複数の値を順番に格納できます。変更可能(ミュータブル)で、順序あり、重複しても大丈夫です。リストの中には他のリストも入れられ、入れ子構造(ネスト)も可能です。
- 定義方法:角括弧 [] を使って、値をカンマ , で区切って並べます。
- 例:[1, 2, 3], ["apple", "banana", "cat"]
test = [1, 2, 3]
print(type(test)) # <class 'list'>
dict(辞書型)
- キーと値のペアでデータを管理する変更可能(ミュータブル)なデータ型です。キーはユニークです。
- 定義方法:中括弧 {} を使って、キー: 値 のペアをカンマ , で区切って並べます。
- 例:{"name": "test", "age": 25}
test = {"name": "test", "age": 25}
print(type(test)) # <class 'dict'>
set(集合型)
- 重複のない値の集まりを表すデータ型です。順序は保証されず、インデックスでアクセスすることはできません。主に、ユニークな値を扱いたいときや集合演算(和・積・差など)に使います。listから重複を取り除きたいときは set() に変換するだけ実行できます。
- 定義方法:波かっこ {} で値を囲むか、set() 関数を使って定義します。
- 例:animals = {"cat", "dog", "monkey"}
# 波かっこを使う方法
colors = {"red", "green", "blue"} # 出力順は毎回変わることがあります
print(type(colors)) # <class 'set'>
# set() 関数を使う方法(リストなどから集合を作る)
numbers = set([1, 2, 2, 3]) # 重複した「2」は1つにまとめられる
print(numbers) # 出力: {1, 2, 3}
tuple(タプル型)
- 複数の値をひとまとめに格納できる変更不可(イミュータブル)のデータ型です。tupleは変更できない代わりに、listよりも処理が少し高速です。
- 定義方法:丸括弧()を使って、値をカンマ , で区切って並べます。ただし丸括弧がなくてもカンマがあればタプルとして認識されます。要素が一つだけの場合も末尾にカンマを忘れると文字列になってしまいます。
- 例:fruits = ("apple", "banana", "orange")
test = ("aaa", "bbb", "ccc")
print(type(test)) # <class 'tuple'>
numbers = 1, 2, 3 # 各括弧なし
single = ("hello",) # タプル
not_tuple = ("hello") # これはただの文字列です
bool型(真偽値型)
- bool型にはTrue、Falseの2つの値しかありません。※ 大文字で始める必要があります。
- 比較演算などの結果は自動的にbool型になります。
test = 1 == 1
print(test) # 出力: True
print(type(test)) # <class 'bool'>
text = 1 > 2
print(text) # 出力: False
Pythonでの足し算(整数、文字列)
整数型と文字列型での「1 + 1」では同じように見えて意味が全く異なります。比較していきます。
整数
test = 1 + 1
print(test) # 出力:2
文字列
test = "1" + "1"
print(test) # 出力:11
整数型では足し算「1 + 1」に対して文字列同士の場合は「結合(連結)」として働きます。
つまり 「"1" + "1"」 は "11" という新しい文字列になります。
違う型での足し算
test = 1 + "1" # TypeError: unsupported operand type(s) for +: 'int' and 'str'
Pythonでは異なる型を直接足すことはできません。なので型を合わせましょう。
Javaの + 演算子は数値の加算と文字列の連結の両方に使われますが、左辺または右辺が文字列なら、全体が文字列連結になるという仕様です。
型変換(キャスト)
test = 1 + int("1")
print(test) # 出力:2
このようにstr(), int()などをすることで意図的に型を変換できます。
自動的な変換
test = 1 + 3.5
print(type(test)) # <class 'float'>
この2つを足すと、Pythonは自動的に整数を浮動小数点に変換してから計算します。 結果は 13.5 という float型 になります。
つまり、Pythonは「数値同士の演算では情報を失わないように、より表現力の高い型(ここではfloat)へ自動変換」してくれています。
PythonとJavaの型付けの違い(動的型付け vs 静的型付け)
プログラミング言語において「型付け」とは、変数がどんな種類のデータを持つかを管理する仕組みです。型付けの方法には主に以下の2種類があります。
- 動的型付け(Dynamic Typing)
- 静的型付け(Static Typing)
まずはPythonとJavaの主な違いを比較して見ていきます。
🆚 主な違い
比較項目 | Python | Java |
---|---|---|
型の厳密性 | 動的型付け(型推論) | 静的型付け(型を明示) |
メモリ効率 | 低(すべてがオブジェクト) | 高(プリミティブ型は軽量) |
型変換 | 自動的に変換されることが多い | 明示的なキャストが必要 |
整数のサイズ | 任意精度(サイズ制限なし) | 固定サイズ(例:int は32bit) |
文字型 |
str 型(1文字も文字列として扱う) |
char 型あり(UTF-16で1文字を表現) |
Javaのプリミティブ型は、クラスではなく、メソッドを持ちません。Pythonでは、整数や文字列もオブジェクトなので、メソッドや属性を持ちます。Pythonの int は任意精度で、サイズが大きくなるとメモリも増えます。一方Javaのint は32ビット固定で、非常に効率的です。
🐍Python:動的型付け
- 変数に型を明示的に指定しない。
- 代入された値によって自動的に型が決まる。
- 実行時に型の整合性がチェックされる。
例
test = 10 # int型
test = "Hello" # str型に変更!
print(test) # 出力:Hello
メリット
- コードが見やすく、柔軟。
デメリット
- 型の不一致によるバグが実行時までわからない。
☕Java:静的型付け
- 変数を宣言する際に型を明示的に指定する必要がある。
- コンパイル時に型の整合性がチェックされる。
- 型が一致しないとコンパイルエラーになる。
例 ※比較としてここだけJavaを使っています。
int test = 10;
test = "hello"; // コンパイルエラー:型がintなのにStringを代入しようとしている
String str = "10";
int test = Integer.parseInt(str); // OK:数値文字列を整数に変換出来ます。
System.out.println(test); // 出力: 10
メリット
- 型の不一致によるバグを事前に防げる。
デメリット
- 型の不一致によるバグが実行時までわからない。
- 柔軟性が低いため、異なる型間での代入には明示的な型変換(キャスト)が必要。
- Pythonと比較すると初心者には難易度がJavaの方が高い。
まとめ
自分がこの間まで受けていた研修の復習も兼ねて書いてみました。記事を書くことによってデータ型について理解が深まりました。PythonとJavaを比較して見るといかにPythonが初心者に分かりやすいなと思いました。これからも勉強がてら書いていこうと思います。