如何使用取模运算符将数字限制在两个常量之间?

5 投票
1 回答
12208 浏览
提问于 2025-04-17 22:03
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之间,但不包括这两个数。也就是说,一旦x达到了100,就应该重新回到20。

我明白用while循环可以做到这一点,比如说当boundX小于最小值时,但我在使用取模运算符时遇到了一些困难,写出正确的表达式也有点问题。

比如,调用boundThis(201)应该返回21,而调用boundThis(100)应该返回20。

1 个回答

15

请注意,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

撰写回答