web-dev-qa-db-fra.com

Comment limiter un nombre à être dans une plage spécifiée? (Python)

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.

35
Mantis Toboggan
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
48
Adrien Plisson

Si vous voulez être mignon, vous pouvez faire:

n = sorted([minN, n, maxN])[1]
39
Steve Howard

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)
37
Björn

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
2
Platinum Azure