Pythonで絶対値を取得するabs(), math.fabs()

Modified: | Tags: Python, 数値

Pythonで絶対値を取得するには、組み込み関数abs()か標準ライブラリmathモジュールのfabs()を使う。

abs()で整数intの絶対値を取得

abs()に整数intを指定するとその絶対値が返される。返り値は整数int

print(abs(100))
# 100

print(abs(-100))
# 100

print(type(abs(100)))
# <class 'int'>
source: abs_usage.py

abs()で浮動小数点数floatの絶対値を取得

abs()に浮動小数点数floatを指定するとその絶対値が返される。返り値は浮動小数点数float

print(abs(1.23))
# 1.23

print(abs(-1.23))
# 1.23

print(type(abs(1.23)))
# <class 'float'>
source: abs_usage.py

abs()で複素数complexの絶対値(大きさ)を取得

Pythonでは虚数単位をjとして複素数complexを扱える。

abs()に複素数complexを指定するとその絶対値(大きさ、複素数平面における原点からの距離)が返される。返り値は浮動小数点数float

print(abs(1 + 1j))
# 1.4142135623730951

print(abs(3 + 4j))
# 5.0

print(type(abs(3 + 4j)))
# <class 'float'>
source: abs_usage.py

特殊メソッド__abs__()

abs()を実行すると特殊メソッド__abs__()が呼ばれる。abs(x)x.__abs__()と等価。

print((-100).__abs__())
# 100

print((-1.23).__abs__())
# 1.23

print((3 + 4j).__abs__())
# 5.0
source: abs_usage.py

リストなどの__abs__()が定義されていない型のオブジェクトをabs()の引数に指定するとエラーになる。

l = [-2, -1, 0, 1, 2]

print(hasattr(l, '__abs__'))
# False

# print(abs(l))
# TypeError: bad operand type for abs(): 'list'
source: abs_usage.py

上の例のhasattr()はオブジェクトが指定した属性・メソッドを持っているかを判定する組み込み関数。

自作のクラスでも__abs__()を定義することでabs()に対する処理を実装できる。ここでは説明のために単に100を返している。

class MyClass:
    def __abs__(self):
        return 100

mc = MyClass()

print(abs(mc))
# 100
source: abs_usage.py

数値のリストの要素を絶対値に変換

数値のリストの要素を絶対値に変換するには、リスト内包表記でabs()を適用する。

l = [-2, -1, 0, 1, 2]

print([abs(i) for i in l])
# [2, 1, 0, 1, 2]
source: abs_usage.py

NumPyのnp.abs()を使ってリストの要素を絶対値に変換することもできる。

math.fabs()abs()の違い

math.fabs()abs()と同様に絶対値を返すが、返り値は常に浮動小数点数float。整数intに対しても浮動小数点数floatを返す。

import math

print(math.fabs(-100))
# 100.0

print(type(math.fabs(-100)))
# <class 'float'>

print(math.fabs(-1.23))
# 1.23

print(type(math.fabs(-1.23)))
# <class 'float'>
source: math_fabs.py

math.fabs()は実数にのみ対応し、複素数complexを指定するとエラーになる。

# print(math.fabs(3 + 4j))
# TypeError: must be real number, not complex
source: math_fabs.py

__abs__()を呼ぶわけではないので、__abs__()が定義されたクラスのオブジェクトを指定してもエラーになる。

class MyClass:
    def __abs__(self):
        return 100

mc = MyClass()

# math.fabs(mc)
# TypeError: must be real number, not MyClass
source: math_fabs.py

関連カテゴリー

関連記事