Вычисление абсолютного значения в Python: от простого к сложному

Раздел: Основы Python -> Функции

Абсолютное значение в Python: основы и варианты

Наиболее эффективный способ получить абсолютное значение числа в Python - использовать встроенную функцию abs(). Она принимает одно число (целое, вещественное или комплексное) и возвращает его модуль. Для комплексных чисел возвращается евклидова норма (sqrt(real^2 + imag^2)).

# Простейшие примеры
print(abs(-5))        # 5
print(abs(3.14))      # 3.14
print(abs(3+4j))      # 5.0 (sqrt(3^2+4^2)=5.0)

аргументы print python (аргументы функции print в python)

5
3.14
5.0

Python 3 аргументы (аргументы в python 3)

Функция abs() работает быстро (реализована на C) и является идиоматическим решением для любых типов, поддерживающих операцию модуля через метод __abs__.

Как вычислить абсолютное значение через math.fabs?

Модуль math содержит функцию fabs(), которая всегда возвращает float. Она подходит, когда нужен строго вещественный результат.

import math
print(math.fabs(-10))    # 10.0
print(math.fabs(7))      # 7.0
print(math.fabs(3+4j))   # TypeError: can't convert complex to float

аргумент параметр python (аргументы и параметры в python)

10.0
7.0
TypeError: can't convert complex to float

аргумент класса python (аргументы класса python)

Проблема: math.fabs не работает с комплексными числами и всегда возвращает float. При потере точности при больших целых числах (преобразование в float может округлить). Решение - использовать abs() для целых или комплексных чисел.

Как получить модуль массива чисел с помощью numpy.abs?

Для массивов и матриц удобнее использовать numpy.abs() (или numpy.absolute). Она поэлементно вычисляет абсолютное значение и поддерживает все числовые типы NumPy, включая комплексные.

import numpy as np
arr = np.array([-1, -2.5, 3+4j])
print(np.abs(arr))

Python аргументы строки (аргументы строки в python (командная строка))

[1.  2.5 5. ]

аргумент метода python (аргументы метода python)

Проблема: Для скаляров numpy.abs медленнее встроенного abs из-за накладных расходов на вызов библиотеки. Не следует использовать NumPy для одного числа без необходимости.

Как написать собственную функцию абсолютного значения через условный оператор?

В учебных целях можно реализовать модуль вручную: если число отрицательное, вернуть его с обратным знаком. Этот метод не работает для комплексных чисел.

def my_abs(x):
    if isinstance(x, (int, float)):
        return x if x >= 0 else -x
    else:
        raise TypeError('Unsupported type')

print(my_abs(-7))   # 7
print(my_abs(0.0))  # 0.0
print(my_abs(3+4j)) # TypeError

Python args (аргументы в python)

7
0.0
TypeError: Unsupported type

именованные аргументы функции python (именованные аргументы функции python)

Проблема: Ручная реализация не обрабатывает комплексные числа, требует проверки типа и работает медленнее встроенной функции. Ошибки: забыли обработку bool (bool является подклассом int), или неправильно определили тип.

Как использовать квадратный корень для вычисления модуля?

Математически модуль числа равен квадратному корню из квадрата числа: sqrt(x**2). Работает только для вещественных чисел.

import math
x = -5.0
print(math.sqrt(x*x))  # 5.0

именованные аргументы python (именованные аргументы python)

5.0

количество аргументов функции python (количество аргументов функции python)

Проблема: Для больших чисел x**2 может вызвать переполнение (overflow). Также медленнее, чем abs(). Не подходит для целых и комплексных.

Как получить абсолютное значение через max и min?

Можно использовать max(x, -x) или max(x, -x) if x >= 0 else -x. Неэффективно, но наглядно.

x = -3
print(max(x, -x))  # 3
print(max(-x, x))  # 3

параметры и аргументы функции python (параметры и аргументы функции python)

3
3

Python передать аргументы (передача аргументов в python)

Проблема: Для комплексных чисел -x не определено (возникает ошибка). Требуется дополнительная проверка.

Как реализовать модуль через лямбда-функцию?

Лямбда с условным выражением: lambda x: x if x >= 0 else -x. Удобно для передачи в функции высших порядков.

abs_lambda = lambda x: x if x >= 0 else -x
print(abs_lambda(-10))  # 10
print(abs_lambda(0))    # 0

Python принять аргументы (приём аргументов в python)

10
0

Проблема: Не поддерживает комплексные числа. Лямбда менее читаема, чем abs().

Выбор метода зависит от контекста. Для большинства задач достаточно abs(). При работе с массивами - numpy.abs. Для учебных целей можно реализовать свою версию, но в production стоит использовать стандартную.

- Python тип аргумента (тип аргумента в python)
- Python функция в качестве аргумента (функция как аргумент в python)
- Python return value (возвращаемое значение функции в python)

Расширенные примеры работы с абсолютным значением

Комплексные числа и их модуль

Функция abs() для комплексных чисел возвращает евклидову норму. Полезно при работе с векторами и сигналами.

Пример
# Модуль комплексного числа вручную через hypot
import math
z = 3 + 4j
print(abs(z))                    # 5.0
print(math.hypot(z.real, z.imag))  # 5.0

# Модуль массива комплексных чисел
import numpy as np
carr = np.array([1+2j, -3-4j, 0+1j])
print(np.abs(carr))
5.0
5.0
[2.23606798 5.         1.        ]

Пользовательские классы, поддерживающие abs()

Можно определить метод __abs__ в своём классе, чтобы объект работал с abs().

Пример
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
5.0

Абсолютное значение в списках с map и list comprehension

Пример
numbers = [-5, 3, -1, 0, -8]
abs_list = [abs(x) for x in numbers]
print(abs_list)

# Через map
abs_list_map = list(map(abs, numbers))
print(abs_list_map)
[5, 3, 1, 0, 8]
[5, 3, 1, 0, 8]

Использование abs с типом Decimal

Для точных денежных расчётов применяют Decimal. Функция abs() тоже работает.

Пример
from decimal import Decimal, getcontext
getcontext().prec = 6
d = Decimal('-123.456789')
print(abs(d))  # 123.456789 (не округляется)
123.456789

Применение abs в pandas DataFrame

Пример
import pandas as pd
df = pd.DataFrame({'A': [-1, -2, 3], 'B': [4, -5, -6]})
print(df.abs())
   A  B
0  1  4
1  2  5
2  3  6

Производительность: сравнение методов

Пример
import timeit

setup = 'x = -123456789'
print('abs:', timeit.timeit('abs(x)', setup=setup))
print('math.fabs:', timeit.timeit('import math; math.fabs(x)', setup=setup))
print('conditional:', timeit.timeit('x if x >= 0 else -x', setup=setup))
abs: 0.044
math.fabs: 0.130
conditional: 0.047

abs() и условный оператор сравнимы, но abs() лаконичнее. math.fabs медленнее из-за импорта и преобразования в float.

Обработка ошибок: нечисловые типы

Пример
try:
    print(abs('hello'))
except TypeError as e:
    print(f'Ошибка: {e}')

# Для строк можно написать собственную функцию
def abs_str(s):
    return abs(len(s))  # бессмысленно, но демонстрация

print(abs_str('hello'))  # 5
Ошибка: bad operand type for abs(): 'str'
5

Использование abs с Fraction (дроби)

Пример
from fractions import Fraction
frac = Fraction(-3, 4)
print(abs(frac))  # 3/4
3/4

Абсолютное значение в Python - comments

En
абсолютное значение python (python)