そもそも「型」って何のためにあるの?
「型(type)」というのは、その値がどう振る舞うかを Python に伝えるためのカテゴリです。整数どうしを足せば計算になり、文字列どうしを足せば連結になる。一方で文字列と整数を足そうとするとエラーになります。値にどんな操作ができるかは、その型によって決まるというわけです。
Python には、よく使われる組み込みの python データ型 が一通り揃っています。中でも int・float・str・bool の4つは、ほぼどんなプログラムを書いても登場する定番です。それ以外の型は、データをまとめて扱いたくなったタイミングで出てきます。
数値型:int と float
Python の数値には2種類あって、書き方によってどちらの型になるかが自動で決まります:
小数点がなければ int、小数点があれば float になります。計算では両者を自由に混ぜられますが、float が絡む演算の結果は必ず float になります。
Pythonの整数(int)はメモリが許す限り無制限に大きくできます。32ビットや64ビットの上限もなければ、オーバーフローもありません。2 ** 1000 を計算しても、全桁がそのまま返ってきます。
一方、浮動小数点数(float)は一般的なIEEE 754に従うので、おなじみの落とし穴がいくつかあります。
これを実行すると 0.3 ではなく 0.30000000000000004 と表示されます。これは Python のバグではなく、どの言語でも共通する二進浮動小数点数の仕様です。お金の計算など、正確な小数が必要な場面では decimal モジュールを使いましょう。それ以外の用途なら、表示時に丸めるだけで十分なことがほとんどです。
文字列型(str)
文字列は文字の並びです。シングルクォートでもダブルクォートでも囲めます。Python はどちらでも気にしません。ただし、開きと閉じのクォートは揃えてくださいね。
三重引用符で囲んだ文字列(""" ... """)は複数行にまたがって書けます。
文字列のAPIはかなり豊富で、使いこなせるようになるには少し時間がかかります。スライス、.upper() や .split()、.replace() といったメソッド、それから f"Hello, {name}" のように書けるf文字列など、覚えることがたくさんあります。文字列については次のページでじっくり解説します。
bool型(真偽値)
真偽値は True と False の2つだけで、先頭を必ず大文字にして書きます。比較演算の結果は真偽値として返ってきます。
内部的には、True と False はそれぞれ 1 と 0 そのものとして扱われます。なので、いくつの条件が True だったかを数えたいときは、ブール値をそのまま足し算できてしまいます。
None:値が存在しないことを表す
None は、Python で「値がない」ことを示すための特別な値です。明示的に return を書かない関数は、自動的に None を返します。プレースホルダーとして使うのもよくあるパターンです。
None との比較は == None ではなく、is None・is not None で書くのが慣例です。is は同一性(identity)を比較するので、ここで本当に確認したいのはまさにそれなんです。
リスト・タプル・セット・辞書
Python に組み込みで用意されているコレクション型は、この 4 つです。それぞれ専用のページで詳しく扱いますが、まずは見分けがつくように、ざっくりとした特徴だけ押さえておきましょう。
使い分けの目安はこんな感じです。
- リスト (list): 中身が変わることを前提にした並び。追加・削除・ソート、なんでもOK。
- タプル (tuple): 変えたくない並び。
(x, y)座標のように、形が決まったレコードによく使います。 - セット (set): 重複があると困る場面向けの、ユニークな要素の集まり。
- 辞書 (dict): キーで引くためのデータ構造。JSON っぽい形ですね。
Python の型変換
リスクのある型変換を Python が勝手にやってくれることはありません。整数を文字列にしたり、文字列を数値にしたりするのは、こちらから明示的にお願いする必要があります。
変換が意味をなさないとき――たとえば int("hello") のようなケース――Python は ValueError を投げて、何を渡したのかまで教えてくれます。エラーが出たら、原因を読んで直して、先に進みましょう。
型を確認する方法
押さえておきたいのは、次の2つです。
type() はREPLでサッと確認したいときに便利です。一方、実際のコードで使うなら isinstance() の出番。継承とも相性が良く、複数の型をまとめてチェックできるのが強みです。
ちょっとした実験タイム
まずは下のコードをそのまま動かしてみてください。慣れてきたら値をいくつか書き換えて、型がどう変わるか観察してみましょう:
for をまだ理解していなくても大丈夫です。これから学んでいきますが、この例でPythonの組み込みデータ型の雰囲気が一気につかめるはずです。
データに合った型を選ぶ
今すぐすべての型を暗記する必要はありません。ただし、コードの中で見かけたときに「これはあの型だな」と気づけること、そして自分でデータを作るときに適切な型を選べるようになることは大事です。「中身は固定?それとも変わる?」「重複はアリ?ナシ?」「取り出すときはキーで探す?それとも位置で?」——この4つの問いを押さえておけば、9割のケースでコレクション型は自然と決まります。
次は文字列を深掘りしていきましょう。ほぼすべてのプログラムで触れることになる、もっとも出番の多いデータ型です。
よくある質問
Pythonの主なデータ型は何ですか?
数値型(intとfloat)、文字列(str)、ブール(bool)、None、そしてコレクション系の4つ(list、tuple、set、dict)が基本です。Pythonのコードで目にするものは、ほぼこれらに bytes・complex・frozenset などを加えた組み合わせでできています。
値の型を調べるにはどうすればいい?
type() に渡せばOKです。type(42) なら <class 'int'>、type('hi') なら <class 'str'> が返ってきます。True/Falseで判定したいときは isinstance(value, int) を使いましょう。サブクラスも拾ってくれるので、こちらのほうが柔軟です。
Pythonは静的型付け? それとも動的型付け?
動的型付けの言語です。変数はどんな型の値でも指せますし、同じ変数の型が途中で変わってもかまいません。変数を宣言するときに型を決めて以降変更できないJavaやC++とは、ここが大きく違うポイントです。