← Назад к вопросам
Что использовал из библиотеки 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:
- sqrt — квадратный корень (очень часто)
- log2 — в алгоритмике и анализе сложности
- ceil/floor — округление при работе с страницами, сетками
- pi, e — в вычислениях
- gcd — упрощение дробей, алгоритмика
- sin/cos — геометрия и графика
- log, log10 — логарифмическое масштабирование
- inf, nan — для граничных случаев и инициализации
Модуль math — это основной инструмент для научных вычислений и алгоритмики в Python. Я использую его регулярно в backend коде для расчётов, обработки координат и анализа сложности.