如何检查一个数字是否在一个区间内



假设我得到:

first_var = 1
second_var = 5
interval = 2

我想要一个区间从second_var像second_var ± interval(从3到7)。我想检查first_var是否在这个区间内。在这个特殊的例子中,我想要False如果是first_var = 4,我想要True

我可以这样做:

if (first_var > second_var-interval) and (first_var < second_var+interval):
  #True

是否有更python的方法来做到这一点?

您可以使用类似数学的序列,因为Python支持

if (second_var-interval < first_var < second_var+interval):
     # True

注意python中的注释以#

开头

我使用__contains__类来表示间隔:

class Interval(object):
    def __init__(self, middle, deviation):
        self.lower = middle - abs(deviation)
        self.upper = middle + abs(deviation)
    def __contains__(self, item):
        return self.lower <= item <= self.upper

然后定义一个函数interval来简化语法:

def interval(middle, deviation):
    return Interval(middle, deviation)

那么我们可以这样调用它:

>>> 8 in interval(middle=6, deviation=2)
True
>>> 8 in interval(middle=6, deviation=1)
False

对于Python 2,这个解决方案比使用rangexrange更有效,因为它们不实现__contains__,它们必须搜索匹配的值。

Python 3更智能,range是一个像xrange一样高效的生成对象,但也实现了__contains__,因此它不必搜索有效值。xrange在Python 3中不存在

此解决方案也适用于浮点数。

另外,请注意,如果使用range,则需要小心off-by-1错误。

如果你要做一次或两次以上,最好封装它。

你可以使用lambdas:

lmd = lambda fv, sv, inval: print('True') if 
    sv - inval < fv < sv + inval else print('False')

,像这样使用

lmd(first_var, second_var, interval)

但是有点长!

if (first_var in range(second_var-interval, second_var+interval+1)):
    #Do something

相关内容

  • 没有找到相关文章

最新更新