Функция abs() в Python: как найти модуль числа

Модуль числа в Python возвращает встроенная функция abs(): abs(-7) даёт 7, импорт не нужен.

Внутри примеры для целых, дробных и комплексных чисел, разница с math.fabs(), модуль массива в NumPy и четыре ошибки, из-за которых результат выходит не тем, что ждали.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3233 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3887 экспертных мнений Подписаться на Телеграм-канал
Обложка: Функция abs() в Python: как найти модуль числа

Чтобы получить модуль числа в Python, вызовите встроенную функцию abs(): abs(-7) вернёт 7, а abs(3.5) вернёт 3.5. Импортировать ничего не нужно, функция доступна сразу после запуска интерпретатора. Она работает с целыми и дробными числами, с комплексными, а ещё с типами Decimal и Fraction.

Ниже разберём, что возвращает abs() для каждого типа, чем от неё отличается math.fabs(), как взять модуль сразу у массива в NumPy и где новички чаще всего ошибаются. Остальные базовые команды языка собраны в шпаргалке по командам Python для начинающих.

CheckroiCheckroiПодборка курсов по Python570 курсов • 53 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как работает abs(): синтаксис и первые примеры

Рой показывает на числовой прямой расстояние от нуля

Запись короткая: abs(x), в скобках число, переменная или целое выражение. В документации Python сказано, что функция возвращает абсолютное значение числа, а если число комплексное, его модуль (magnitude).

Как найти модуль числа:

  1. Передайте число или переменную в скобки: abs(-7) или abs(x).
  2. Сохраните результат, если он понадобится дальше: distance = abs(x). Сама переменная x при этом не меняется.
  3. Используйте результат в выражении: abs(a - b) даёт расстояние между двумя числами без оглядки на то, какое из них больше.
print(abs(-7))
print(abs(3.5))
print(abs(-0.0))
print(abs(0))

a, b = 15, 42
print(abs(a - b))
7
3.5
0.0
0
27

Тип результата повторяет тип аргумента: из целого числа получается целое, из дробного выходит дробное. Ноль со знаком минус -0.0 превращается в обычный 0.0.

Что возвращает abs() для разных типов

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

Аргумент Тип Результат
abs(-7) int 7
abs(-7.25) float 7.25
abs(3 + 4j) complex 5.0
abs(Decimal("-12.50")) Decimal 12.50
abs(Fraction(-3, 4)) Fraction 3/4
abs(True) bool 1
abs(float("-inf")) float inf

Ограничения на размер у целых чисел нет: abs(-10**30) спокойно вернёт число из 31 цифры. Про то, как устроен сам тип int, подробно рассказано в статье о целых числах в Python.

Модуль комплексного числа

У комплексного числа a + bj модуль считается как длина вектора: корень из суммы квадратов a и b. Поэтому результат всегда float, даже если обе части целые.

print(abs(3 + 4j))
print(abs(-2 - 1j))
5.0
2.23606797749979

Для числа -2 - 1j это корень из пяти. Как ещё извлекать корни в питоне, разобрано в статье о корне в Python.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

abs() или math.fabs(): в чём разница

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

abs() math.fabs()
Нужен импорт нет import math
-7 7 7.0
-7.25 7.25 7.25
3 + 4j 5.0 TypeError
Свой класс с __abs__ работает не работает
import math

print(math.fabs(-7))
print(math.fabs(-7.25))
math.fabs(3 + 4j)
7.0
7.25
TypeError: must be real number, not complex

В обычном коде берите abs(): она сохраняет тип и не требует импорта. math.fabs() пригодится, когда дальше нужен строго float, например чтобы целое не смешалось с дробными в одном столбце вычислений. Чем int отличается от float и какие ещё числовые типы есть в языке, видно в таблице типов данных Python.

Модуль числа для массива в NumPy

Встроенная abs() не принимает список: abs([1, -2]) падает с TypeError. Для списка подойдёт генератор, а для больших массивов — NumPy.

nums = [1, -2, 3, -4]
print([abs(n) for n in nums])
print(list(map(abs, nums)))
[1, 2, 3, 4]
[1, 2, 3, 4]

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

CheckroiCheckroiПодборка курсов по NumPy77 курсов • 17 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→
import numpy as np

arr = np.array([-3, 5, -1.5, 0])
print(np.abs(arr))
print(np.abs(np.array([3 + 4j, -1 + 0j])))
[3.  5.  1.5 0. ]
[5. 1.]

Встроенная abs(arr) на массиве NumPy тоже сработает и вернёт тот же массив модулей. Если массив только складываете, посмотрите как суммировать список в Python через sum() и NumPy.

Типовые задачи с модулем числа

Рой радуется, что нашёл ближайшее число в списке

Сама по себе abs() простая, а пользу приносит в связке с min(), sorted() и сравнениями.

Найти число, ближайшее к нулю или к цели

Передайте abs в параметр key функции min(). Сравнение пойдёт по модулю, а вернётся исходное число со знаком.

nums = [12, -3, 7, 25, -9]
print(min(nums, key=abs))

target = 10
print(min(nums, key=lambda x: abs(x - target)))
-3
12

Во второй строке ищем число, ближайшее к десяти. У 12 расстояние до цели 2, у 7 уже 3, поэтому выигрывает 12.

Отсортировать по модулю

print(sorted(nums, key=abs))
print(sum(abs(n) for n in nums))
[-3, 7, -9, 12, 25]
56

Знаки остались на месте, порядок задан модулями. Чем sorted() отличается от метода sort(), разобрано в статье о сортировке списков.

Сравнить дробные числа

Сравнивать float через == рискованно: 0.1 + 0.2 == 0.3 даёт False. Разницу можно проверить через модуль и маленький допуск, а можно взять готовую math.isclose(), которая делает то же самое.

import math

print(0.1 + 0.2 == 0.3)
print(abs((0.1 + 0.2) - 0.3) < 1e-9)
print(math.isclose(0.1 + 0.2, 0.3))
False
True
True

Почему так происходит с дробями, объясняется в статье об операторах Python, в разделе про 0.1 + 0.2.

Другие математические функции Python

Модуль числа входит в небольшой набор встроенных функций для расчётов. Все они работают без импорта, а за корнями, логарифмами и тригонометрией нужно идти в math. Потренироваться на них можно в 30 задачах по Python для начинающих.

Функция Что делает Пример → результат
abs(x) модуль числа abs(-7) → 7
round(x, n) округление до n знаков round(3.14159, 2) → 3.14
pow(x, y) степень, то же что x ** y pow(2, 10) → 1024
pow(x, y, m) степень по модулю m pow(3, 4, 5) → 1
divmod(a, b) частное и остаток парой divmod(17, 5) → (3, 2)
min(), max() наименьшее и наибольшее min(4, -9, 2) → -9
sum() сумма элементов sum([1.5, -2, 3]) → 2.5
math.sqrt(x) квадратный корень math.sqrt(16) → 4.0
math.ceil(x), math.floor(x) округление вверх и вниз math.floor(-2.1) → -3
math.hypot(x, y) длина вектора math.hypot(3, 4) → 5.0
math.prod() произведение элементов math.prod([2, 3, 4]) → 24

Сюрпризы чаще всего приносит round(). По документации, если два варианта одинаково близки, округление идёт к чётному: round(0.5) и round(-0.5) дают 0, а round(1.5) даёт 2. Там же разобран round(2.675, 2): он возвращает 2.67 вместо ожидаемых 2,68, потому что большинство десятичных дробей нельзя точно записать в float. Если нужно округлять только вверх, смотрите разбор math.ceil. Остаток от деления и divmod() подробно описаны в статье об операторе %.

CheckroiCheckroiПодборка курсов для Python-разработчиков85 курсов • 33 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→ Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Как abs() работает со своими классами

Когда вы пишете abs(obj), Python вызывает у объекта метод __abs__(). Значит, модуль можно определить и для собственного типа, например для вектора на плоскости.

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __abs__(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5

print(abs(Vector(3, 4)))
5.0

Так же устроены Decimal, Fraction и массивы NumPy: у каждого свой __abs__(). Если классы пока в новинку, начните со статьи об ООП простыми словами.

Частые ошибки и что с ними делать

Рабочий стол программиста с ноутбуком и блокнотом формул

TypeError: bad operand type for abs(): ‘str’

Число пришло строкой, обычно из input() или из файла. Строку сначала нужно перевести в число.

print(abs(int("-5")))
5

Как безопасно читать числа с клавиатуры, разобрано в статье про int(input()).

Переменная после abs() осталась отрицательной

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

x = -5
abs(x)
print(x)
x = abs(x)
print(x)
-5
5

abs() вернула отрицательное число в NumPy

У массивов NumPy фиксированный размер ячейки. В типе int8 помещаются числа от −128 до 127, и для −128 положительной пары нет. Поэтому модуль возвращает то же −128, и ошибки при этом не будет.

import numpy as np

i8 = np.array([-128, -5, 100], dtype=np.int8)
print(np.abs(i8))
print(np.abs(i8.astype(np.int16)))
[-128    5  100]
[128   5 100]

Решение: перед расчётом переведите массив в более широкий тип через astype(). У встроенного int такой проблемы нет, его размер не ограничен.

Модуль нужен со знаком другого числа

Иногда нужна величина одного числа и знак другого. Писать условие не нужно: для этого есть math.copysign(). Например, math.copysign(5, -2) вернёт -5.0, а -abs(8) даст гарантированно отрицательное -8.

Где освоить Python системно

Функция abs() закрывает одну маленькую задачу. Когда таких задач становится много, имеет смысл один раз пройти типы данных, функции и библиотеки вроде NumPy по программе с практикой и проверкой кода. В подборке ниже курсы по Python с ценами и сроками, их можно сравнить на одной странице. Все программы собраны в каталоге курсов Python.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 754 ₽4108 ₽/мес.9 месяцевОбзор курса
Профессия Python-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Как найти модуль числа в Python?

Вызовите встроенную функцию abs(): abs(-7) вернёт 7, abs(-2.5) вернёт 2.5. Импортировать ничего не нужно, а тип результата совпадает с типом аргумента.

Чем abs() отличается от math.fabs()?

math.fabs() требует import math, принимает только вещественные числа и всегда возвращает float: math.fabs(-7) даст 7.0. Комплексное число она не примет, а abs() вернёт для него модуль.

Как взять модуль всех элементов списка?

Сама abs() список не принимает. Используйте генератор [abs(n) for n in nums] или list(map(abs, nums)), а для массива NumPy вызовите np.abs(arr).

Что вернёт abs() для комплексного числа?

Длину вектора, то есть корень из суммы квадратов действительной и мнимой частей. abs(3 + 4j) вернёт 5.0, результат всегда float.

Почему np.abs() вернула отрицательное число?

Так бывает с массивами фиксированного размера: в int8 у числа −128 нет положительной пары, и np.abs() возвращает −128. Переведите массив в более широкий тип через astype(np.int16) перед расчётом.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!