データと型

概要

image

プログラミングには様々な種類の「データ」が登場します。 たとえば計算をするための「数値」であったり、テキストを扱うための「文字列(文字の連なり)」などがあります。

プログラミング言語ではこの「データの種類」のことを「型」と呼んでいます。 「型」と「型ができる処理」は密接に関係していて、たとえば数値であれば足し算や引き算ができます。 一方、文字列であれば「アルファベットを全て大文字にする」といった文字列の独特な処理ができます。

型とはなにか

プログラミングでは「数字」や「テキスト」といった様々な種類のデータが使われます。 それらのデータの種類は「 」と呼ばれています。

たとえば、数字の5や10は「整数型」という型です。 一方、'Hello'や'Python'といったテキスト(文字列と呼ばれる)は「文字列型」という型です。 型という抽象的な概念があって、それに実際の値となる数値5や文字列"Hello"が属しているということです。

image

型と密接に結びつく処理

型とそれができる処理は密接に結びついています。 例えば数値は「10 ÷ 5」といったように割り算が使えますが、 文字列は「"Hello" ÷ "Python"」などというようにはできません。

初心者がプログラミングを学ぶには「どのような型があり、それが何をできるのか」をまず覚える必要があります。

例えばプログラムをある程度覚えてゲーム作りを始めたとしましょう。 そこではどこにキャラクターがジャンプしたときの座標を求める「数値型の計算」であったり、 メッセージを枠に収めるために「1つの長い文字列を複数行に分ける」といった処理が必要になります。 もう少し難しい例では「画面上に複数存在するキャラクターをどのように扱うか」といったことも、 それを扱う適切な型と処理を知らなければ仕組みを作ることができません。

それぞれの型の細かい使い方は型ごとの解説ページで行います。 ここでは初心者向けに実例を使って、型とそれができる処理が結びついていることを説明します。

Python のプロンプトを立ち上げて以下を実行してみてください。

インタプリタ: 数値の足し算と引き算

>>> 3 + 3
6
>>> 3 - 1
2

上記のように数値は足し算、引き算することができます。

では、文字列はどうでしょうか。 文字列はシングルクオテーション「'」でアルファベットや記号を囲むことで作成できます。

インタプリタ: 文字列の足し算(結合)

>>> 'hello' + ' python'
'hello python'

文字列の後ろに別の文字列をくっつけるという「結合」処理がされています。 文字列の結合は数値の足し算とは違いますが、これも直感的な処理内容といえるのではないでしょうか。

続いて文字列の引き算をしてみます。

インタプリタ: 文字列の引き算

>>> 'hello' - 'python'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

文字列の引き算では、エラーが表示してしまいました。 数値であれば足し算も引き算もできるものの、文字列では足し算(結合)しかできないことがわかります。

今回の例とは逆に文字列でしかできない処理というものも存在しています。 例えば「アルファベットを全て大文字にする」という処理が文字列型ではできますが、 これを数値型ではできません。

image

「どの型がどのような処理をすることができるか」ということを覚えると、 「自分が実現したい処理をするにはどういう書き方をすればいいか」ということが分かってきます。 大きなプログラムもそういった細かいデータ処理と、後ほど学ぶ制御構造を組み合わせることで実現されています。 初心者向けのサンプルプログラムは地味でパッとせず、それがどのように役にたつかいまいち分かりづらいかもしれませんが、 それらを理解しないと大きなプログラムは組めないため基礎は必ず覚えて下さい。

どの型がどのような処理をできるかということは、プログラミング言語ごとに若干異なります。 ただ、どの言語でもそれほど大きな違いはありませんので、 型と処理の関係の知識がたまるとそのプログラミング言語だけでなく、プログラミング全般の自体の知識が向上します。

数値 vs 文字列型の数字

見た目には似ているように見えるデータも、型が違えば別物です。 例えば「3」はあきらかに数値型ですが、「'3'」は数値に見えてもクオテーションで囲まれているため文字列です。

実際にそれぞれのデータで引き算の処理をさせると、「'3'」ではエラーが発生します。

インタプリタ: 文字列の数字は引き算に失敗

>>> 3 - 1
2
>>> '3' - '1'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

数値型と文字列型の違いは慣れれば間違えませんが、 滅多に使わないような型だと扱いを間違える場合があるかもしれませんので注意をして下さい。

型の確認 (type)

あるデータがどの型のものかは「 type関数 」にデータを引数として渡すと分かります。

インタプリタ: type関数で型を確認

>>> type('hello')
<class 'str'>
>>> type(5)
<class 'int'>
>>> type('5')
<class 'str'>

型の表示は英語となっていますが、「str」は「String(文字列)」で、 「int」は「Integer(整数)」を表しています。 「'hello'」は文字列で、「5」は整数型(数値型)と分かります。

型の変換(キャスト)

ある型を別の型に変換することを「キャスト」といいます。 たとえば数値型から文字列型への変換は以下のように行います。

>>> str(123)
'123'

先ほどtype関数で「文字列」に対応していた「str」を、関数として使っています。 この関数に与えた数値型の「123」は文字列型の「'123'」となっています。

これとは逆に文字列を数値型(整数型)にキャストすることもできます。 キャストには数値型を示す「int」を関数として使っています。

>>> int('123')
123

文字列型や整数型だけでなく、他の主要な型の多くはキャストして変換することができます。

文字列へのキャスト

文字列型へのキャストは他の型のキャストに比べてよく利用されます。

先ほどプログラムファイルを実行する際にprint関数を使ってコンソールへ出力をしました。 print関数は文字列以外に数値なども出力させることができますが、 その出力するテキストを作る際にキャストを多用します。

例えば「'hello'」という文字列に数値の「5」を加えて「'hello5'」としたい場合、 そのまま足し算をするとエラーが発生します。

>>> 'hello' + 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

これは文字列と数値型を結合することができないためです。

このような場合は、数値を文字列に変換してから、それを結合するという手順をふみます。

>>> 'hello' + str(5)
'hello5'

プログラムの処理をコンソールに出力したりするために文字列を作ることはよくあります。 キャストを駆使して文字列を作る以外にも、文字列のフォーマットといったテクニックもあります。

image