Zauważyłem, że w Pythonie istnieją dwie podobnie wyglądające metody znajdowania wartości bezwzględnej liczby:
Pierwszy
abs(-5)
druga
import math
math.fabs(-5)
Czym różnią się te metody?
math.fabs()
konwertuje swój argument na float, jeśli może (jeśli nie może, zgłasza wyjątek). Następnie przyjmuje wartość bezwzględną i zwraca wynik w postaci liczby zmiennoprzecinkowej.
Oprócz abs()
liczb zmiennoprzecinkowych działa również z liczbami całkowitymi i liczbami zespolonymi. Jego typ zwracany zależy od typu argumentu.
In [7]: type(abs(-2))
Out[7]: int
In [8]: type(abs(-2.0))
Out[8]: float
In [9]: type(abs(3+4j))
Out[9]: float
In [10]: type(math.fabs(-2))
Out[10]: float
In [11]: type(math.fabs(-2.0))
Out[11]: float
In [12]: type(math.fabs(3+4j))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/npe/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))
TypeError: can't convert complex to float
abs
działa z czymś więcej niż tylko liczbami całkowitymi i zmiennoprzecinkowymi, a typ wyniku nie zawsze jest taki sam jak argument, npabs(3+4j)
.fabs
trwa to dłużej ze względu na jego zawsze pływający charakter i masz właściwą odpowiedź!__builtin__.abs()
powodzeniem zastosować?__abs__
magiczną metodęEdycja: jak zasugerował @aix, lepszy (bardziej sprawiedliwy) sposób porównania różnicy prędkości:
Więc wydaje się, że
abs()
ma tylko niewielką przewagę szybkości nadfabs()
liczbami całkowitymi. Dla pływakówabs()
ifabs()
zademonstruj podobną prędkość.Oprócz tego, co powiedział @aix, jeszcze jedna rzecz do rozważenia to różnica prędkości:
Więc
abs()
jest szybszy niżmath.fabs()
.źródło
from math import fabs
na pewno i spróbuj-5.0
dla obu.math.fabs()
zawsze zwracaabs()
liczbę zmiennoprzecinkową, podczas gdy może zwracać liczbę całkowitą.źródło
abs
może zwrócić dowolny typ, w zależności od__abs__
specjalnej metody typu, do którego jest wywoływana.abs()
: Zwraca wartość bezwzględną zgodnie z argumentem, tj. Jeśli argument jest typu int, to zwraca int, jeśli argument jest zmiennoprzecinkowy, zwraca wartość typu float. Działa również na zmiennej złożonej, tj.abs(a+bj)
Również działa i zwraca wartość bezwzględną, tjmath.sqrt(((a)**2)+((b)**2)
math.fabs()
: Działa tylko na wartościach całkowitych lub zmiennoprzecinkowych. Zawsze zwraca bezwzględną wartość zmiennoprzecinkową bez względu na typ argumentu (z wyjątkiem liczb zespolonych).źródło