如何使用取模运算符将数字限制在两个常量之间?
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
请注意,min
和 max
是已经内置的函数,所以不要用这两个名字来命名变量,因为你不能像下面这样做(假设你不是想生成一个在指定范围内的数字列表):
>>> 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
补充:
关于循环条件,可以把它看作一个数学问题。你知道,取模运算符基本上是用来找出除法运算中剩下的余数,所以我们可以利用这个特性。因此,如果你的偏移量是 0
到 n
,那么基本情况非常简单。
>>> 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