如何使用模数运算符绑定两个常量之间的数字?

时间:2014-03-13 02:21:31

标签: python algorithm

def boundThis(x):
    min = 20
    max= 100
    boundX = int(x)
    if (boundX > max):
        boundX = boundX % max + min-1
        if (boundX > max):
          boundX-=max-1
    else:
        while(boundX < min):
            boundX += max-min
    return boundX

我试图在两个数字之间绑定x,20和100(不包括)。也就是说,一旦达到100,就应该回到20。

我得到了它如何与while循环一起工作,(虽然boundX&lt; min)但是我遇到了模数运算符的麻烦并且用它写了正确的表达式。

实施例。 boundThis(201)应该给我21,并且boundThis(100)给我20。

1 个答案:

答案 0 :(得分:7)

请注意minmax已经内置了函数,因此请不要使用这些标识符命名变量,因为您可以执行以下操作(假设您不是尝试生成指定范围内的数字列表):

>>> def bound(low, high, value):
...     return max(low, min(high, value))
... 
>>> bound(20, 100, 1000)
100
>>> bound(20, 100, 10)
20
>>> bound(20, 100, 60)
60

编辑:

对于环绕条件,将此视为数学问题。如你所知,模运算符基本上可以找到除数上除法运算剩余的余数,因此我们可以使用它。因此,如果偏移量为0n,则基本情况非​​常简单。

>>> 99 % 100
99
>>> 101 % 100
1

但是你希望它偏离某个基础值(low),所以你必须应用基础数学并将问题减少到上面的那个。我建议你在阅读下面的解决方案之前尝试自己解决这个问题。

>>> def bound(value, low=20, high=100):
...     diff = high - low
...     return (((value - low) % diff) + low)
...
>>> bound(0)
80
>>> bound(19)
99
>>> bound(20)
20
>>> bound(100)
20
>>> bound(99)
99