Мне нужно написать функцию, которая проверяет, находится ли число в диапазоне 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. Есть ли способ сделать это проще?

2
avi 15 Дек 2015 в 14:37

3 ответа

Лучший ответ

Ты можешь сделать

def IsCloseEnough(num1, num2 ):
     return abs(float(num1 - num2) / float(num1)) < 0.1 
5
MaTh 15 Дек 2015 в 11:48

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() .

6
Dimitris Fasarakis Hilliard 17 Янв 2016 в 05:07

Я думаю, что самый ясный способ очень близок к вашей функции, с некоторыми изменениями:

  • Вы проверяете, находится ли число в пределах 1%, а не в пределах 10%
  • Вы можете использовать сравнение цепочек
  • вы можете напрямую вернуть результат вместо использования if/else

Как это:

def isCloseEnough(num1, num2):
    return num1 * 0.9 < num2 < num1 * 1.1
4
tobias_k 15 Дек 2015 в 11:45