Pythonで絶対値を取得するabs(), math.fabs()
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()
を適用する。
- 関連記事: Pythonリスト内包表記の使い方
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