我想将指定范围内的数字的偏移量相加,如果结果在某个范围之上,我希望结果环绕该范围



我想把我的数字添加到一系列数字中。之后,我想在提供的范围内为我的原始号码添加一个号码。如果我加的数字也大于提供的范围,我希望它从一开始就继续加。不管怎么做,我下面的代码加起来是97,但我希望它是67。

big = range(60,90)
num = 84
if num in big:
print(num + 13)

您的描述有点不清楚,但您似乎在寻找模块化算术。试试这个:

lower_bound = 60
upper_bound = 90
num = 84
num += 13
reduced_num = (num - lower_bound)%(upper_bound-lower_bound) + lower_bound

%运算符在除以给定的数字时取余数,所以如果你用num在60以上的量求出,然后取该数字的%30,再把60加回来,你会得到一个介于60和90之间的数字。

如果你想在有限域中进行数学运算,你需要的不仅仅是一个范围。当您对值使用算术运算符时,您需要将该范围绑定到您的值并应用到该值。

这里有一个类,它表示一个应用了模运算的值

class ModularValue:
"""Represents a value in a finite field of integers.
The field is closed over the standard arithmetic operators,
meaning that if the value should exceed the field in either
direction, it will 'wrap around' to the other side.
"""
def __init__(self, value, lo, hi):
self.lo = lo
self.hi = hi
self.value = self.clamp(value)
@staticmethod
def fromrange(value, rng):
return ModularValue(value, rng.start, rng.stop)
def __repr__(self):
return f"ModularValue({self.value}, {self.lo}, {self.hi})"
def __str__(self):
return str(self.value)
def clamp(self, value):
return (value % (self.hi - self.lo)) + self.lo
def __add__(self, addend):
return ModularValue(self.clamp(self.value + addend), self.lo, self.hi)
def __sub__(self, minuend):
return ModularValue(self.clamp(self.value - minuend), self.lo, self.hi)

我只做了加法和减法。我把其他算术运算符的实现留给读者练习。

您可以使用范围的开始值和停止值创建一个值,也可以使用静态方法创建一个范围外的对象,如下所示:

m = ModularValue(84, 60, 90)
# or
m = ModularValue.fromrange(84, range(60, 90))

如果你在这个值上加13,你会得到预期的67。

>>> print(m + 13)
67

最新更新