Noté que en Python hay dos métodos de búsqueda similares para encontrar el valor absoluto de un número:
primero
abs(-5)
Segundo
import math
math.fabs(-5)
¿En qué se diferencian estos métodos?
math.fabs()
convierte su argumento en flotante si puede (si no puede, lanza una excepción). Luego toma el valor absoluto y devuelve el resultado como flotante.
Además de flotantes, abs()
también funciona con números enteros y complejos. Su tipo de retorno depende del tipo de argumento.
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
funciona con mucho más que números enteros y flotantes, y el tipo de resultado no siempre es el mismo que el argumento, por ejemploabs(3+4j)
.fabs
tomar más tiempo debido a su naturaleza siempre flotante y tendrá la respuesta correcta.__builtin__.abs()
pueden aplicar con éxito?__abs__
método mágicoEditar: como sugirió @aix, una forma mejor (más justa) de comparar la diferencia de velocidad:
Entonces, parece que
abs()
solo tiene una ligera ventaja de velocidad sobre losfabs()
números enteros. Para flotadoresabs()
yfabs()
demostrar una velocidad similar.Además de lo que ha dicho @aix, una cosa más a considerar es la diferencia de velocidad:
Entonces
abs()
es más rápido quemath.fabs()
.fuente
from math import fabs
con seguridad y pruebe-5.0
con ambos.math.fabs()
siempre devuelve float, mientras queabs()
puede devolver un entero.fuente
abs
puede devolver cualquier tipo, dependiendo del__abs__
método especial del tipo al que se llama.abs()
: Devuelve el valor absoluto según el argumento, es decir, si el argumento es int, entonces devuelve int, si el argumento es float, devuelve float. También funciona en variables complejas, es decir,abs(a+bj)
también funciona y devuelve valor absoluto, es decirmath.sqrt(((a)**2)+((b)**2)
math.fabs()
: Solo funciona con valores enteros o flotantes. Siempre devuelve el valor flotante absoluto sin importar cuál sea el tipo de argumento (excepto para los números complejos).fuente