Python入門 - 整数型(int) / 浮動小数点型(float) / 複素数型(complex); 数値の表現形式と型の変換について
本ページではPythonの入門コンテンツとして初学者向けにPythonでの数値の取り扱いについて記載します。
要約#
Python には次の数値表現型があります。
- 整数 ( int )
整数値を示す値を表現する形式。
- 浮動小数点数 ( float )
実数を表現する形式です。
- 複素数 ( complex )
複素数を表現する形式です。
Pythonではコンストラクタを経由することで異なるデータ型に変換することができます。
Pythonにおける数値の種類#
数値 (numbers) は文字通り数字で表現されたデータのことを指します。わざわざ説明なんてされなくてもわかる、と思われるかもしれません。その通りです。日常生活で使っている数値です。
本ページではPythonで取り扱われる数値について説明します。
数値には以下の3種類が存在します。かっこの中は Python で定義されている型の名前です。
- 整数 ( int )
整数値を示す値を表現する形式です。0, 1, 2, ... あるいはそれにマイナスをつけた -1, -2 ... といったものです。
- 浮動小数点数 ( float )
実数を表現する形式です。 0.1, -0.005 などです。
- 複素数 ( complex )
複素数を表現する形式です。 1 + j, 12 -3j, などと表現されます。
それぞれについて説明します。
整数#
整数はその名の通り整数を表現するデータ型です。あまり説明の必要はないですね。
以下のように type() 関数を利用することで実際にその型を確認することができます。
type(100)
# => <class 'int'>
浮動小数点数#
浮動小数点数 はコンピュータ関係の勉強をしていないとあまりなじみのない用語かもしれません。一旦「浮動」を無視して考えれば理解しやすいです。「小数点数」、つまり小数を利用して表現されるようなデータです。実数のことだと理解しておけば、それほど違いはありません[1] 。
浮動小数点数の「浮動」(flaot) が意味するところは小数点の . の位置が可変である、ということです。これは歴史的な由来もあるのであまり気にせずともOKです。
type(0.2)
# => <class 'float'>
複素数#
複素数 (complex) に関しては理学系の勉強には付き物ですがあまりなじみのない方もいるかと思います。
複素数は実数 (real numbers) と虚数 (imaginary numbers) から構成されますが、ご存じでない方の中で気になる方は 複素数 や 虚数 でお調べください。Pythonで準備はされていますが、特殊な計算をしない限りほとんどお目にかからないと思うので知らなくてもOKです。
Pythonでは虚数単位を j あるいは J で表現します。
この複素数は他の数値と異なりコンストラクタを呼び出して作成する必要があります。コンストラクタについては下の コンストラクタについて で解説します。
c = complex(1, 1)
print(c)
# => (1+1j)
type(c)
# => <class 'complex'>
文字列と数値の相互変換について#
コンストラクタについて#
先ほど複素数のデータを生成する際に利用したのと、これから話す内容で必要であるためコンストラクタについて少し説明します。
コンストラクタ (constructor) は詳しくはクラスについて解説する時に説明しますが、簡単に言うと 特定の型のデータを作るときに利用するもの です。型の名前を関数の呼び出しのように利用することでそのデータを作成することができます。
上記では複素数を利用する際に使用していますが、これと同じ形で文字列や他の数値のデータを生成することもできます。
int_data = int(0)
float_data = float(0.004)
string_data = str('文字列データ')
print(f'int_data ({type(int_data)}) = {int_data}')
# => int_data (<class 'int'>) = 0
print(f'float_data ({type(float_data)}) = {float_data}')
# => float_data (<class 'float'>) = 0.004
print(f'string_data ({type(string_data)}) = {string_data}')
# => string_data (<class 'str'>) = 文字列データ
これは一見無駄なことをしているようにも見えますね。なぜそのように思えてしまうのか、それは int , float や str という型が特殊であるためです。
これらの型は非常によく利用されるため、適合する数値や文字列を宣言するための作法にのっとることで自動的に生成されるようになっているのですね。複素数のようなあまり使われない型ではそれがないために明示的に[2] コンストラクタを利用してあげる必要があります。
コンストラクタと型変換#
それではコンストラクタは int や float に対しては出番が一切ないのかというとそんなことはありません。これらを相互に変換するために利用されます。
例えば次の計算を実施すると、実は暗黙的に型が変換されてしまい float になってしまいます。
int1 = 5
int2 = 2
answer = int1 / int2
print(f'answer is {answer} ({type(answer)})')
# => answer is 2.5 (<class 'float'>)
まぁこの場合には 5 を 2 で割っているのだからあたりまえでは?となってしまいますが、次の例ではどうでしょうか。
int1 = 6
int2 = 2
answer = int1 / int2
print(f'answer is {answer} ({type(answer)})')
# => answer is 3.0 (<class 'float'>)
6 を 2 で割っているので、気持ちとしては int の 3 になってほしいところだと思います。しかし Python では 割り算をする際に自動的に float に変換してしまうのです。
これがのちに出てくるリスト型などで利用する際に少し厄介になる可能性があります。リスト型では数値を指定して特定の位置のデータを取り出すことが可能なのですが、この数値として int しか受け取ってくれず、 float を誤って渡してしまうとエラーが生じてしまいます。
そこで必要となってくるのが型の変換 (type casting) です。
コンストラクタによる型の変換例 ( 数値どうしの変換 )#
ここでコンストラクタが登場します。とても単純で、変換したい値をコンストラクタに入れてあげるだけです。
まずは特に説明の不要な int から float への変換を実施します。 12 が 12.0 となり、無事に float へ変換されていることが確認できます。
int_num = 12
float_num = float(int_num)
print(f'float_num is {int_num} ({type(float_num)})')
# => float_num is 12.0 (<class 'float'>)
それでは逆に float から int へ変換してみます。この際に、小数点以下のデータが落ちてしまうので注意が必要です。
float_num = 12.56
int_num = int(float_num)
print(f'int_num is {int_num} ({type(int_num)})')
# => int_num is 12 (<class 'int'>)
12.56 という値が 12 に変換されました。 0.56 の部分は切り捨てられました。 float から int に変換する際には 小数点以下を切り捨ててしまうので注意が必要 です。これは int が整数のみを取り扱っている関係上仕方のない処理です。
小数点以下を切り捨てずに、四捨五入してほしいという場合には round() という組み込み関数[3] を利用しましょう。
float_num = 12.56
int_num = round(float_num)
print(f'int_num is {int_num} ({type(int_num)})')
# => int_num is 13 (<class 'int'>)
コンストラクタによる型の変換例 ( 数値と文字列 )#
他の変換例として数値と文字列の変換を見てみます。まずは数値から文字列への変換です。これは予想通りの動作だと思います。ここではせっかく文字列に変換したので f-string ではなく文字列の結合を利用しています。
int_num = 10
float_num = -4.3
string_data1 = str(int_num)
string_data2 = str(float_num)
print('string_data1 = ' + string_data1)
# => string_data1 = 10
print('string_data2 = ' + string_data2)
# => string_data1 = -4.3
逆に文字列から数値への変換をしてみます。具体的に何に使うのか、という点の理解を深める目的も踏まえて、ここで文字入力関数の input を利用します。これはユーザからの文字入力を受け取ることができる関数です。
# まず下記の行だけを実施し、数値を入力してエンターを押してください
user_input = input('数字を入力してください: ')
# それから下記の2行を入力
answer = int(user_input) / 2
print(f'あなたの入力した値を2で割ると {answer} です。')
あなたが入力した値を 2 で割った結果が出力されたことと思います。この計算ができたのは int(user_input) という部分によって一度 int 型に変換したからこそできる技です。 int() を float() に変更することで実数を受け取ることも可能です。
変換を実施しない場合どうなるか見てみましょう。文字列に大して割り算をしようとしたためエラーが出力されます。
answer = user_input / 2
# => Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: unsupported operand type(s) for /: 'str' and 'int'
補足: 変換できない文字への対応#
ちょっと意地悪な人は数字以外を入力してみたくなったかもしれません。実際にやってみるとエラーが発生することがわかります。
string_data = '変換できないよ 100'
data = int(string_data)
# => Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ValueError: invalid literal for int() with base 10: '変換できないよ 100'
出力されているエラーを日本語にすると、 「'変換できないよ 100'は int() により 10進数に変換できません」という内容です。
ユーザからの入力を期待する場面ではこういったエラーに対応する必要が出てきます。意地悪な人がいたり、あるいは間違えて文字を入れてしまう可能性もありますからね。
こういった問題への対処は後々例外処理などの個所で学ぶこととなります。
まとめ#
本ページではPythonで利用される数値の型としてどのようなものがあるかについて解説しました。またそれらのデータを相互に変換する操作について解説しました。ついでにユーザからの入力を貰う方法も解説しました。
ここまでで数値と文字列については十分操作ができるようになりました。基本的なデータ型が操作できるようになったのでここからはもう少しPythonを使ってプログラムっぽいものを書いていく方に進みたいところなのですが、まだ1つ大事なデータ型があるのでそれについて次には解説しようと思います。