Je veux limiter un nombre pour être dans une certaine fourchette. Actuellement, je fais ce qui suit:
minN = 1
maxN = 10
n = something() #some return value from a function
n = max(minN, n)
n = min(maxN, n)
Cela le maintient dans minN
et maxN
, mais cela n’a pas l’air très agréable Comment pourrais-je le faire mieux?
PS: Pour votre information, j'utilise Python 2.6.
def clamp(n, minn, maxn):
return max(min(maxn, n), minn)
ou fonctionnellement équivalent:
clamp = lambda n, minn, maxn: max(min(maxn, n), minn)
maintenant, vous utilisez:
n = clamp(n, 7, 42)
ou le rendre parfaitement clair:
n = minn if n < minn else maxn if n > maxn else n
encore plus clair:
def clamp(n, minn, maxn):
if n < minn:
return minn
Elif n > maxn:
return maxn
else:
return n
Si vous voulez être mignon, vous pouvez faire:
n = sorted([minN, n, maxN])[1]
Utilisez simplement numpy.clip()
( doc ):
n = np.clip(n, minN, maxN)
Cela fonctionne aussi pour les tableaux entiers:
my_array = np.clip(my_array, minN, maxN)
Définissez une classe et disposez d'une méthode pour définir la valeur qui effectue ces validations.
Quelque chose de semblable à ce qui suit:
class BoundedNumber(object):
def __init__(self, value, min_=1, max_=10):
self.min_ = min_
self.max_ = max_
self.set(value)
def set(self, newValue):
self.n = max(self.min_, min(self.max_, newValue))
# usage
bounded = BoundedNumber(something())
bounded.set(someOtherThing())
bounded2 = BoundedNumber(someValue(), min_=8, max_=10)
bounded2.set(5) # bounded2.n = 8