ZetCode

Python abs 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 abs 函数,该函数返回数字的绝对值。我们将介绍数字类型、自定义对象以及计算大小和距离的实际示例。

基本定义

abs 函数返回数字的绝对值。对于实数,它会删除任何负号。对于复数,它返回模。

主要特点:适用于整数、浮点数、复数和任何实现 __abs__ 的对象。它始终返回一个非负值(复数为浮点数)。

基本数字用法

以下是不同数字类型的简单用法,显示了 abs 如何处理正数、负数和复数。

basic_abs.py
# With integers
print(abs(10))     # 10
print(abs(-10))    # 10

# With floats
print(abs(3.14))   # 3.14
print(abs(-3.14))  # 3.14

# With complex numbers
print(abs(3 + 4j)) # 5.0 (sqrt(3² + 4²))

此示例展示了不同数字类型的 abs。对于实数,它只是删除负号。对于复数,它使用勾股定理计算模。

复数示例返回 5.0,因为 √(3² + 4²) = 5。 对于复数,结果始终为浮点数。

距离计算

绝对值通常用于计算点之间的距离。此示例显示了在 1D 和 2D 空间中的实际应用。

distance.py
def distance_1d(a, b):
    return abs(a - b)

def distance_2d(p1, p2):
    return abs(complex(p2[0] - p1[0], p2[1] - p1[1]))

print(distance_1d(5, 9))        # 4
print(distance_1d(9, 5))        # 4
print(distance_2d((1,2), (4,6))) # 5.0

1D 距离计算两个数字之间的绝对差。2D 版本使用复数来计算点之间的欧几里得距离。

这演示了 abs 如何通过自动处理方向性(点的顺序无关紧要)来简化距离计算。

具有 __abs__ 的自定义对象

您可以通过实现 __abs__ 特殊方法使自定义对象与 abs 一起工作。此示例创建了一个 Vector 类。

custom_abs.py
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __abs__(self):
        return (self.x**2 + self.y**2)**0.5
    
    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v = Vector(3, 4)
print(abs(v))  # 5.0

Vector 类实现 __abs__ 以返回其模。当我们在 Vector 实例上调用 abs 时,Python 使用此方法。

这种模式在具有大小或长度概念的数学类中很常见(向量、复数等)。

错误处理

当与不支持的类型一起使用时,abs 函数会引发 TypeError。此示例显示了正确的错误处理。

errors.py
try:
    print(abs("hello"))
except TypeError as e:
    print(f"Error: {e}")  # bad operand type for abs(): 'str'

class NoAbs:
    pass

try:
    print(abs(NoAbs()))
except TypeError as e:
    print(f"Error: {e}")  # bad operand type for abs(): 'NoAbs'

这些示例演示了 abs 对不支持类型的作用。字符串和没有 __abs__ 的对象会引发 TypeError

要使一个类与 abs 一起工作,请实现 __abs__,如上一个示例所示。

性能注意事项

此示例比较了 abs 的性能与获取绝对值的替代方法。

performance.py
import timeit
import math

def test_abs():
    return abs(-3.14)

def test_math_fabs():
    return math.fabs(-3.14)

def test_conditional():
    return -3.14 if -3.14 < 0 else 3.14

print("abs():", timeit.timeit(test_abs, number=1000000))
print("math.fabs():", timeit.timeit(test_math_fabs, number=1000000))
print("Conditional:", timeit.timeit(test_conditional, number=1000000))

这评估了不同的绝对值方法的性能。对于内置类型,abs 通常是最快的。 math.fabs 专门用于浮点数。

条件方法较慢且可读性较差,这说明了为什么在大多数情况下首选 abs

最佳实践

资料来源

作者

我是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。 我在教授编程方面拥有超过十年的经验。

列出所有 Python 教程