我需要编写一个函数来检查一个数字是否在10%另一个数字的范围内.
我写了这个函数:
def IsCloseEntough(num1, num2 ):
percent = num1/100
if num1-percent < num2 and num2< num1+percent:
return True;
else:
return False;
Run Code Online (Sandbox Code Playgroud)
它返回True如果 num1-10% of num1 < num2 < num1+10%.这解决了问题,但感觉这个代码不是非常"Python Like".有没有办法让它更简单?
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
Run Code Online (Sandbox Code Playgroud)
这是一个内置的(因此你可以有效地使用它filter()),它可以检查两个数字的接近程度,并在尝试查找近似值时提供更大的灵活性.
在内部,它abs以类似的方式使用解决方案,为您自己查看C源代码,它最有可能获得它的效率.(可以找到它的python版本here)
对于旧版本的Python,您可以使用已经指出的解决方案,或者查看如何math.isclose()实现并获得灵感.
请注意,在大多数情况下rel_tol应该指定,除非处理附近的值0.另外,对于应该评估数组元素的情况,最有效的用法可能是由numpy.isclose()函数提供的.
我认为最清晰的方法非常接近你的功能,有一些改动:
if/else像这样:
def isCloseEnough(num1, num2):
return num1 * 0.9 < num2 < num1 * 1.1
Run Code Online (Sandbox Code Playgroud)
你可以做
def IsCloseEnough(num1, num2 ):
return abs(float(num1 - num2) / float(num1)) < 0.1
Run Code Online (Sandbox Code Playgroud)