【Python】 数値型の基本について(int, float, complex)

Pythonの数値型は整数型(int)、浮動小数点型(float)、複素数(complex)の3種類あります。これらを生成する際には型宣言は必要なく、数値リテラルからPythonのインタープリターが自動的に判断してくれます。
本記事では、数値型の特徴や生成方法、そしてそれぞれの組み込み関数の使い方の基本についてまとめました。
#2020/3/15 更新

確認した環境

  • OS:Ubuntu16.04LTS
  • Python3.7.4

数値型の概要と特徴

Pythonの数値型は3種類(整数、浮動小数点、複素数)あります。
型宣言は不要で、数値をそのとおり書くだけ(数値リテラル)でPythonが自動的に解釈してくれます。
それぞれの特徴は下表の通りです。

生成方法 精度
数値リテラル 組込み関数
整数 (int) 整数値を記述 int() 制限なし
浮動小数点 (float) 小数点または指数表記を含む数値を記述 float() たいていはC言語のdoubule相当(※1)
複素数 (complex) a + bj またはa + bJ で表される複素数を記述(a, bは数値リテラル) complex() 虚部と実部はそれぞれ浮動小数点(※2)

(※1)浮動小数点型の精度はsys.float_infoで確認ができます。
筆者の環境(Ubuntu16.04LTS, Python3.7)では下記のようになりました。

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

(※2)下記のようにして確認できます。

>>> n = 1 + 2j

>>> type(n.real)
<class 'float'>

>>> type(n.imag)
<class 'float'>

数値型の生成方法

数値リテラルによる数値型の生成

数値リテラルとは

数値リテラルとはコード上に直接書かれた「数値」のことです。下記にWikipediaより引用します。

コンピュータプログラミング言語においてリテラルは、ソースコード内に値を直接表記したものをいう。

Wikipedaia リテラル

数値リテラルによる数値型データ生成の例

  • 整数(int)
  • 単純に、整数値を書きます。

    # 整数の場合
      >>> n = 1
      >>> type(n)
      <class 'int'>
  • 浮動小数点(float)
  • 小数点または指数表記を含む数値を書きます。

    # 小数点の場合
      >>> n = 1.23
      >>> type(n)
      <class 'float'>
    
      >>> m = 0.002
      >>> type(m)
      <class 'float'>
    
      # 指数表記の場合
      >>> k = 2.0E3
      >>> type(k)
      <class 'float'>
  • 複素数(complex)
  • a + bjまたはa + bJの形式で書くと、複素数になります。
    (a、bは整数でも浮動小数点でもOK)

    # a + bj の形
      >>> n = 2 + 5j 
      >>> type(n)
      <class 'complex'>
    
      # a + bJ の形
      >>> m = 3 + 8J
      >>> type(m)
      <class 'complex'>

    但し、 数値とJ (またはj)を逆にすると変数とみなされ、NameErrorが送出されます。

    >>> m = 3 + J8
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      NameError: name 'J8' is not defined

組み込み関数を使った生成方法

整数型: int()

基本的な使いかた

整数型は組み込み関数のint() を使って生成できます。
使い方は以下です。

int(x, base=10)

数値または文字列xから作成された整数オブジェクトを返します。

# 引数に数値を指定
>>> a = 123
>>> int(a)
123

# 符号を付けることが出来ます
>>> a = -123
>>> int(a)
-123

# 引数に文字列を指定
>>> a = '123'
>>> int(a)
123

# 余白で囲んでも上手く処理されます。
>>> a = ' 123 '
>>> int(a)
123

ちなみに、浮動小数点を設定すると小数点以下切り捨てで整数に変換されます。

>>> a = 1.23
>>> int(a)
1

>>> b = 1.79
>>> int(b)
1

尚、引数を省略した場合は0が返ります

>>> int()
0

エラーとなる例

・複素数はTypeErrorとなります

>>> a = 1+3j
>>> int(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to int

・数値でない文字列の場合はValueErrorが返ります

>>> a = 'abc'
>>> int(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'

・文字列に小数点が含まれている場合は数値とは見なされません

>>> a = '1.23'
>>> int(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1.23'

何進数で解釈するか?

第二引数baseは第一引数xを何進数で解釈するかを設定します。デフォルトはbase=10(10進数)です。
尚、この場合の引数xは、文字列(またはbytes インスタンス、 bytearray インスタンス)である必要があります。

# 2進数で解釈(base = 2)
>>> int("100", base=2)
4

# 8進数で解釈(base = 8)
>>> int("100", base=8)
64

# 16進数で解釈(base = 16)
>>> int("100", base=16)
256

浮動小数点型: float()

基本的な使いかた

float(x) を使うと数値または文字列xから浮動小数点が生成されます。

# 数値を指定
>>> a = 123
>>> float(a)
123.0

# 符号を付けることができます
>>> a = -123
>>> float(a)
-123.0

# 文字列を指定
>>> a = '123'
>>> float(a)
123.0

尚、引数を省略した場合は0.0が返ります。

>>> float()
0.0

また、正負の無限大を表す文字列も設定できます。( “inf”、 “Inf”、 “INFINITY” 、 “iNfINity” “NaN”)

>>> a = 'inf'
>>> float(a)
inf

>>> a = 'infinity'
>>> float(a)
inf

>>> a = 'NaN'
>>> float(a)
nan

エラーとなる例

桁区切りでアンダースコア(_)が使えますが(但しPython3.6以降)、カンマ(,)を使うとTypeErrorが送出されます。(タプルに見えてしまうんですね)

# アンダースコアの場合
>>> a = 123_456
>>> float(a)
123456.0

# カンマの場合
>>> a = 123,456
>>> float(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: float() argument must be a string or a number, not 'tuple'

複素数

基本的な使いかた

複素数を生成するには、組み込み関数complex() を使います。
使い方は以下です。

complex([real[, imag]])

引数のとり方は2つあります。

  • 実部realと虚部imagを別々に設定する方法
  • # 整数を引数にした場合
    	>>> a = 1
    	>>> b = 2
    	>>> complex(a, b)
    	(1+2j)
    
    	# 浮動小数点を引数にした場合
    	>>> a = 1.23
    	>>> b = 4.56
    	>>> complex(a, b)
    	(1.23+4.56j)
  • a+bjの形で文字列で指定する方法
  • この場合は、第二引数を取りません

    >>> a = '2+3j'
    	>>> complex(a)
    	(2+3j)

尚、引数を省略すると0jを返します。

>>> complex()
0j

エラーとなる例

・第一引数の文字列が複素数を表していない場合

>>> a = 'abcd'
>>> complex(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string

・第一引数に複素数を表す文字列が設定されているにも関わらず、第二引数がある場合

>>> a = '2+3j'
>>> complex(a, 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: complex() can't take second arg if first is a string

・文字列中に不要なスペースがある場合

>>> a = '2 + 3j'
>>> complex(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string

実部、虚部を取り出す方法

complex型で定義されているreal属性、imag属性を参照することにより、実部、虚部を取り出すことができます。(返り値は浮動小数点型)

# 複素数を生成
>>> a = complex('1+2j')
>>> a
(1+2j)

# 実部を取得(浮動小数点で返ります)
>>> a.real
1.0

# 虚部を取得(浮動小数点で返ります)
>>> a.imag
2.0

共役複素数を返す(conjugate())

c.conjugate() で共役複素数が得られます。

>>> a = 1+2j
>>> a.conjugate()
(1-2j)

>>> b = 1.23+4.56j
>>> b.conjugate()
(1.23-4.56j)

まとめ

Pythonの数値型 3種類(整数型(int)、浮動小数点型(float)、複素数(complex))についてまとめました。これらを使い分けるのに特別な型宣言は必要無く、コード上でその数値を書けばPythonのインタープリターが勝手に解釈してくれます。
また、組み込み関数を使って生成することも出来ます。

  • 整数:int()
  • 浮動小数点:float()
  • 複素数:complex()

<参考>Python公式リファレンス:組み込み型 – 数値型 int, float, complex

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!