Модуль math (часть 2)

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

Продолжаем рассматривать функции модуля math. Следующий блок посвящен функциям:

Функция

Описание

comb(n, k)

возвращает число перестановок из n по k без учета повторений и порядка следования

perm(n, k)

возвращает число перестановок из n по k без учета повторений, но с учетом порядка следования

factorial(n)

вычисление факториала числа n

gcd(*integers)

возвращает наибольший общий делитель для указанных целых чисел

lcm(*integers)

возвращает наименьший общий множитель для указанных целых чисел

isqrt(n)

возвращает целое значение квадратного корня от целого неотрицательного числа n

Первая функция comb(n, k) определяет число сочетаний согласно формуле:

Если k больше n, то функция возвращает 0. Например:

k, n = 2, 7
c = math.comb(n, k)  # 21
math.comb(k, n)  # 0

Вторая аналогичная функция perm(n, k) определяет число сочетаний согласно формуле:

Если k больше n, то функция возвращает 0. Например:

p = math.perm(n, k)  # 42
math.perm(k, n)  # 0

Следующая функция factorial(n) позволяет вычислять факториал неотрицательного целого числа n согласно формуле:

Факториал числа 0 равен 1. Например:

math.factorial(3)  # 6
math.factorial(0)  # 1
math.factorial(-5)  # ValueError

Следующая функция gcd(*integers) находит наибольший общий делитель для переданных целых чисел. Например:

vals = (5, 7, 15, 3, 14)
vals_2 = (30, 5, 15, 25)
 
math.gcd(*vals)  # 1
math.gcd(*vals_2)  # 5

При передаче всех нулевых значений, возвращается 0:

math.gcd(0, 0, 0)  # 0

Вызов функции без аргументов также дает значение 0:

math.gcd()  # 0

Следующая аналогичная функция lcm(*integers) определяет наименьший общий множитель для переданных целых чисел. Например:

math.lcm(*vals)  # 210 = 5 * 7 * 3 * 2

По сути – это произведение всех уникальных простых множителей переданных целых чисел.

Если среди чисел присутствует хотя бы один ноль:

math.lcm(*vals, 0)  # 0

то результат будет 0. Функция без аргументов возвращает 1:

math.lcm()  # 1

Последняя функция этого блока isqrt(n) позволяет выполнять целочисленное извлечение квадратного корня из целого неотрицательного числа:

math.isqrt(0)  # 0
math.isqrt(1)  # 1
math.isqrt(3)  # 1
math.isqrt(5)  # 2
math.isqrt(-1)  # ValueError

Эта функция оптимизирована для целочисленных вычислений и работает быстрее обычной функции sqrt() с последующим отбрасыванием дробной части числа.

Степенные, экспоненциальные и логарифмические функции

Следующий блок образует набор из степенных, экспоненциальных и логарифмических функций:

Функция

Описание

pow(x, y)

возведение в степень x ** y

cbrt(x)

кубический корень числа x

sqrt(x)

квадратный корень числа x

exp(x)

вычисление экспоненты в степени x

exp2(x)

вычисление 2 ** x

expm1(x)

вычисление e ** x - 1

log(x, base)

логарифм числа x по основанию base (по умолчанию base равен e – натуральный логарифм)

log2(x)

логарифм числа x по основанию 2

log10(x)

логарифм числа x по основанию 10

log1p(x)

натуральный логарифм от 1+x

Пользоваться этими функция достаточно просто и очевидно. Первая pow(x, y) возводит число x в степень y. Причем, числа x, y могут быть вещественными. Например:

math.pow(2, 3)  # 8 = 2 ** 3
math.pow(2, -1)  # 0.5
math.pow(-2, 2)  # 4
math.pow(4, 0.5)  # 2 – аналог квадратного корня
math.pow(4, 1/3)  # 1.5874010519681994 – аналог кубического корня

Так как квадратные и кубические корни приходится вычислять довольно часто, то для них отведены свои специальные функции:

math.sqrt(4)  # 2 
math.sqrt(-3)  # ValueError
math.cbrt(8)  # 2
math.cbrt(-8)  # -2

Следующий набор функций позволяет вычислять различные степени экспонент:

math.exp(1)  # 2.718281828459045 – число e
math.exp(-2)  # 0.1353352832366127
math.exp(0.5)  # 1.6487212707001282
math.exp2(16)  # 65536.0
math.exp2(2.5)  # 5.656854249492381
math.expm1(1)  # 1.718281828459045 = e-1
math.expm1(1.5)  # 3.4816890703380645

По идее все эти значения можно было бы вычислить с помощью функции pow(x, y), например:

math.pow(math.e, 0.5)  # 1.6487212707001282 = math.exp(0.5)

Но, во-первых, записать функцию через exp() проще и понятнее, а, во-вторых, функции с exp оптимизированы для вычисления различных видов экспонент и не редко дают более высокую точность, чем прямое вычисление по функции pow().

Последняя группа функций этого блока позволяет вычислять различные логарифмы:

math.log(math.e)  # 1.0 – натуральный логарифм
math.log(1.5)  # 0.4054651081081644 – натуральный логарифм
math.log(8, 2)  # 3.0 – логарифм по основанию 2
math.log(100, 10)  # 2.0 – логарифм по основанию 10

Несмотря на то, что все виды логарифмов можно вычислить с помощью функции log(), в модуле math отдельно присутствуют функции для логарифма по основанию 2:

math.log2(16)  # 4.0

для логарифма по основанию 10:

math.log10(9.5)  # 0.9777236052888477

и для натурального логарифма от 1+x:

math.log1p(1.7)  # 0.9932517730102833

Все эти функции также позволяют создавать более наглядный программный код и оптимизируют соответствующие вычисления. Поэтому использование специализированных функций предпочтительнее использованию общей функции log().

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме