← Назад к вопросам

Что использовал из библиотеки math?

2.0 Middle🔥 91 комментариев
#Python Core#Soft Skills#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что я использовал из модуля math в Python

Это практический вопрос о реальном опыте. Я расскажу о самых полезных функциях из модуля math, которые использую в production коде, и когда их применять.

1. Тригонометрические функции (sin, cos, tan)

import math

# sin, cos, tan работают с радианами, не градусами
angle_degrees = 45
angle_radians = math.radians(angle_degrees)  # Конвертируем в радианы

print(f"sin(45°) = {math.sin(angle_radians):.4f}")  # 0.7071
print(f"cos(45°) = {math.cos(angle_radians):.4f}")  # 0.7071
print(f"tan(45°) = {math.tan(angle_radians):.4f}")  # 1.0000

# Обратные функции
value = 0.5
angle = math.asin(value)  # arcsin
print(f"arcsin(0.5) = {math.degrees(angle)}°")  # 30.0

# Практическое использование: вычисление координат
radius = 100
angle = math.radians(45)
x = radius * math.cos(angle)
y = radius * math.sin(angle)
print(f"Координаты точки на окружности: ({x:.1f}, {y:.1f})")  # (70.7, 70.7)

2. Степени и корни (pow, sqrt)

import math

# Квадратный корень
print(math.sqrt(16))  # 4.0
print(math.sqrt(2))   # 1.4142...

# Кубический корень (используем pow с дробной степенью)
print(pow(27, 1/3))  # 3.0
print(8 ** (1/3))    # 2.0

# Степени
print(math.pow(2, 8))  # 256.0
print(math.pow(10, -3))  # 0.001 (очень удобно для научных вычислений)

# Практическое использование: проверка идеального квадрата
def is_perfect_square(n: int) -> bool:
    sqrt = int(math.sqrt(n))
    return sqrt * sqrt == n

print(is_perfect_square(9))    # True
print(is_perfect_square(10))   # False

# Вычисление гипотенузы (вместо Pythagoras)
a, b = 3, 4
c = math.sqrt(a**2 + b**2)  # 5.0
print(f"Гипотенуза: {c}")

3. Логарифмы (log, log10, log2)

import math

# log(x) — натуральный логарифм (основание e)
print(math.log(10))      # 2.3026...

# log10(x) — логарифм по основанию 10
print(math.log10(100))   # 2.0
print(math.log10(1000))  # 3.0

# log2(x) — логарифм по основанию 2 (очень полезно в CS)
print(math.log2(8))      # 3.0
print(math.log2(16))     # 4.0

# log(x, base) — логарифм с любым основанием
print(math.log(32, 2))   # 5.0

# Практическое использование: определение числа цифр
def count_digits(n: int) -> int:
    if n == 0:
        return 1
    return int(math.log10(abs(n))) + 1

print(count_digits(12345))   # 5
print(count_digits(999))     # 3

# Вычисление сложности алгоритма
def binary_search_steps(n: int) -> int:
    return int(math.log2(n)) + 1

print(f"Для 1M элементов нужно: {binary_search_steps(1_000_000)} сравнений")

4. Округление (ceil, floor, trunc)

import math

value = 3.7
print(f"Исходное значение: {value}")
print(f"math.floor({value}) = {math.floor(value)}")    # 3 (вниз)
print(f"math.ceil({value}) = {math.ceil(value)}")      # 4 (вверх)
print(f"math.trunc({value}) = {math.trunc(value)}")    # 3 (отбросить)
print(f"round({value}) = {round(value)}")              # 4 (ближайший)

# Отличие floor и trunc для отрицательных чисел
value = -3.7
print(f"\nДля {value}:")
print(f"math.floor({value}) = {math.floor(value)}")    # -4 (вниз на числовой оси)
print(f"math.trunc({value}) = {math.trunc(value)}")    # -3 (в сторону нуля)
print(f"math.ceil({value}) = {math.ceil(value)}")      # -3 (вверх)

# Практическое использование: деление нацело (обе стороны)
print(f"\nДеление:")
print(f"17 // 5 = {17 // 5}")           # 3
print(f"math.ceil(17/5) = {math.ceil(17/5)}")  # 4 (округлить вверх)

# Пример: расчёт количества страниц
total_items = 105
items_per_page = 20
pages = math.ceil(total_items / items_per_page)
print(f"Всего страниц: {pages}")  # 6

5. Константы (pi, e, inf, nan)

import math

# Константа пи
diameter = 10
radius = diameter / 2
circumference = 2 * math.pi * radius
area = math.pi * radius ** 2
print(f"Окружность: {circumference:.2f}")
print(f"Площадь: {area:.2f}")

# Число e (основание натурального логарифма)
print(f"e = {math.e}")  # 2.71828...
print(f"e^2 = {math.exp(2)}")  # 7.389...

# Бесконечность и NaN
print(f"\nБесконечность: {math.inf}")
print(f"Отрицательная бесконечность: {-math.inf}")
print(f"NaN (Not a Number): {math.nan}")

# Проверки
print(f"math.isinf(math.inf) = {math.isinf(math.inf)}")  # True
print(f"math.isnan(math.nan) = {math.isnan(math.nan)}")  # True
print(f"math.isfinite(100) = {math.isfinite(100)}")      # True

# Практическое использование: инициализация значений
best_score = -math.inf  # Инициализация для поиска максимума
worst_score = math.inf   # Инициализация для поиска минимума

scores = [85, 92, 78, 88]
for score in scores:
    if score > best_score:
        best_score = score
    if score < worst_score:
        worst_score = score

print(f"Лучший: {best_score}, Худший: {worst_score}")

6. Факториал и комбинаторика (factorial)

import math

# Факториал
print(f"5! = {math.factorial(5)}")      # 120
print(f"10! = {math.factorial(10)}")    # 3628800

# Практическое использование: комбинаторика
def combinations(n: int, k: int) -> int:
    """Количество сочетаний из n по k: C(n,k) = n! / (k! * (n-k)!)"""
    return math.factorial(n) // (math.factorial(k) * math.factorial(n - k))

print(f"Сочетания C(5,2) = {combinations(5, 2)}")  # 10

def permutations(n: int, k: int) -> int:
    """Количество перестановок: P(n,k) = n! / (n-k)!"""
    return math.factorial(n) // math.factorial(n - k)

print(f"Перестановки P(5,2) = {permutations(5, 2)}")  # 20

7. GCD и LCM (gcd)

import math

# Наибольший общий делитель
print(f"gcd(48, 18) = {math.gcd(48, 18)}")  # 6
print(f"gcd(17, 19) = {math.gcd(17, 19)}")  # 1 (взаимно простые)

# Наименьшее общее кратное (через GCD)
def lcm(a: int, b: int) -> int:
    return abs(a * b) // math.gcd(a, b)

print(f"lcm(12, 18) = {lcm(12, 18)}")  # 36

# Практическое использование: упрощение дробей
def simplify_fraction(numerator: int, denominator: int):
    divisor = math.gcd(numerator, denominator)
    return numerator // divisor, denominator // divisor

num, denom = simplify_fraction(48, 18)
print(f"48/18 = {num}/{denom}")  # 8/3

8. Абсолютное значение и знак (fabs, copysign)

import math

# fabs работает с float, abs работает с int
print(f"math.fabs(-5.5) = {math.fabs(-5.5)}")  # 5.5
print(f"abs(-5) = {abs(-5)}")                  # 5

# Копирование знака одного числа к другому
print(f"math.copysign(10, -5) = {math.copysign(10, -5)}")  # -10.0
print(f"math.copysign(10, 5) = {math.copysign(10, 5)}")    # 10.0

Мой реальный пример из production

import math
from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float
    
    def distance_to(self, other: 'Point') -> float:
        """Евклидово расстояние между двумя точками"""
        return math.sqrt((self.x - other.x)**2 + (self.y - other.y)**2)
    
    def angle_to(self, other: 'Point') -> float:
        """Угол от this к other в радианах"""
        dx = other.x - self.x
        dy = other.y - self.y
        return math.atan2(dy, dx)

# Использование
p1 = Point(0, 0)
p2 = Point(3, 4)
print(f"Расстояние: {p1.distance_to(p2):.2f}")  # 5.00
print(f"Угол: {math.degrees(p1.angle_to(p2)):.1f}°")  # 53.1°

# Другой пример: поиск оптимального размера батча
def calculate_optimal_batch_size(dataset_size: int, available_memory_gb: float) -> int:
    """Рассчитывает оптимальный размер батча"""
    bytes_per_sample = 1024 * 8  # 8 КБ
    available_bytes = available_memory_gb * 1024 * 1024 * 1024
    return int(math.floor(available_bytes / bytes_per_sample))

batch_size = calculate_optimal_batch_size(1_000_000, 4.0)
print(f"Оптимальный размер батча: {batch_size}")

Вывод

Самые полезные функции из math:

  1. sqrt — квадратный корень (очень часто)
  2. log2 — в алгоритмике и анализе сложности
  3. ceil/floor — округление при работе с страницами, сетками
  4. pi, e — в вычислениях
  5. gcd — упрощение дробей, алгоритмика
  6. sin/cos — геометрия и графика
  7. log, log10 — логарифмическое масштабирование
  8. inf, nan — для граничных случаев и инициализации

Модуль math — это основной инструмент для научных вычислений и алгоритмики в Python. Я использую его регулярно в backend коде для расчётов, обработки координат и анализа сложности.

Что использовал из библиотеки math? | PrepBro