Otsuhachi’s diary

プログラミングのことや覚書などその他いろいろ

当ブログの内容を使用したり参考にした場合に生じた問題の責任は負いかねます。

Python組み込み関数2 -abs編-

Pythonおさらい第2弾
制約として公式ドキュメントのみ参照*1として、読む癖をつける訓練も兼ねる。

今回はabs関数について。
前回結構頑張ったので今回は緩く済ませられそうな関数をチョイス。
いわゆる絶対値を返す関数としてしか認識していないが実態はいかに……。

読み込むドキュメントはこちら

構成

abs関数の詳細はこんな感じ。

abs(x)

ドキュメントによると、数値の絶対値を返すとのこと。
int, float, complexに加えて__abs__()を実装しているオブジェクトに対応するそう。

以上!

認識が一切覆ることなく、でしょうねという感想しか出てこない。

使ってみる

  1. int型-10, 0, 10に対し使用
  2. float型-10.1, -0.1, 0.0, 0.1, 10.01に対し使用

実行するコードは以下の通り。

def show_abs(text, list_):
    print(text)
    print('-' * 30)
    for i in list_:
        print(f'abs({i}): {abs(i)}')


int_list = [-10, 0, 10]
float_list = [-10.1, -0.1, 0.0, 0.1, 10.01]
show_abs('int型', int_list)
print()
show_abs('float型', float_list)
int型
------------------------------
abs(-10): 10
abs(0): 0
abs(10): 10

float型
------------------------------
abs(-10.1): 10.1
abs(-0.1): 0.1
abs(0.0): 0.0
abs(0.1): 0.1
abs(10.01): 10.01

当然な結果。

自作クラス

さすがにあんまりなので自作クラスに__abs__()を定義して使ってみることにする。
complex複素数型らしいが、学がないのでそもそも複素数が何かわからんです。

実行するコードとその出力は以下の通り。

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def __int__(self) -> int:
        return self.age

    def __str__(self) -> str:
        me = f'{self.name}({self.age})'
        return me

    def __abs__(self) -> int:
        return id(self)


me = Person('Otsuhachi', 28)
print(me, int(me), abs(me), sep='\n')
Otsuhachi(28)
28
2523203087376

abs(me)で返るのは今回実行時のmeのIDなので、プログラム終了までは一定で、実行毎に変動する値になる。
無事、絶対値を取得できる自作クラスを作成できた。

締め

今回は特別学ぶことはなかった印象。
__abs__()を実装すれば自作クラスでも動くとはいえ、現状ではあまり用途が思いつかない。
組み込み関数コンプリートのために書いた感が拭えない結果となった。

これからもif x < 0: x *= -1を省略するためにしか使わなそう。

*1:わかりやすく解説している他サイトを見ない