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

Nar*_*sim 3 python coding-style range intervals

假设我得到了:

first_var = 1
second_var = 5
interval = 2
Run Code Online (Sandbox Code Playgroud)

我想要一个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
Run Code Online (Sandbox Code Playgroud)

是否有更多的pythonic方式来做到这一点?

Bha*_*Rao 8

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

if (second_var-interval < first_var < second_var+interval):
     # True
Run Code Online (Sandbox Code Playgroud)

请注意,python中的注释以a开头 #


Pet*_*ood 5

我使用一个类__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
Run Code Online (Sandbox Code Playgroud)

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

def interval(middle, deviation):
    return Interval(middle, deviation)
Run Code Online (Sandbox Code Playgroud)

然后我们可以这样调用它:

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

>>> 8 in interval(middle=6, deviation=1)
False
Run Code Online (Sandbox Code Playgroud)

在 Python 2 中,这个解决方案比使用更有效,range或者xrange因为它们没有实现__contains__并且它们必须搜索匹配的值。

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

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

另外,请注意,如果您使用,range您需要小心 off-by-1 错误。最好将它封装起来,如果你要做不止一次或两次。