Мне нужно написать функцию, которая проверяет, находится ли число в диапазоне 10%
от другого числа.
Я написал эту функцию:
def IsCloseEntough(num1, num2 ):
percent = num1/100
if num1-percent < num2 and num2< num1+percent:
return True;
else:
return False;
Возвращает True
, если num1-10% of num1 < num2 < num1+10%
. Это решает проблему, однако кажется, что этот код не очень похож на Python. Есть ли способ сделать это проще?
3 ответа
Ты можешь сделать
def IsCloseEnough(num1, num2 ):
return abs(float(num1 - num2) / float(num1)) < 0.1
PEP 0485 представил math.isclose()
(и это сложный родственник cmath.isclose()
для делает такие проверки, он также проверяет специальные значения, такие как NaN
, Inf
и др. Очевидным недостатком является то, что он только появляется в Python 3.5
из того, что я знаю, и оно все еще находится в зачаточном состоянии, поэтому в будущем он может получить некоторые косметические изменения.
Основные функциональные возможности:
math.isclose(1, 1.09, abs_tol=0.1)
Out[20]: True
math.isclose(1.0, 1.2, abs_tol=0.1)
Out[23]: False
math.isclose(1.0, 0.9, abs_tol=0.1)
Out[24]: True
Это встроенный (так что вы можете эффективно использовать его с такими вещами, как filter()
), который предназначен для проверки того, насколько близки две цифры, и обеспечивает большую гибкость при попытке найти приближения.
Внутренне он использует abs
решения, аналогичные представленным здесь, взгляните на C
source , скорее всего, он эффективен настолько, насколько это возможно. (Версию этого python можно найти here
)
Для более старых версий Python вы могли бы использовать уже упомянутые решения или посмотреть, как math.isclose()
был реализован и получить вдохновение.
Обратите внимание, что в большинстве случаев следует указывать rel_tol
, если только вы не работаете со значениями, близкими к 0
. Кроме того, для случаев, когда элементы массива должны оцениваться, наиболее эффективное использование, вероятно, обеспечивается numpy.isclose()
.
Я думаю, что самый ясный способ очень близок к вашей функции, с некоторыми изменениями:
- Вы проверяете, находится ли число в пределах 1%, а не в пределах 10%
- Вы можете использовать сравнение цепочек
- вы можете напрямую вернуть результат вместо использования
if/else
Как это:
def isCloseEnough(num1, num2):
return num1 * 0.9 < num2 < num1 * 1.1
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.