51 votes

Comment limiter un nombre pour qu'il soit compris dans un intervalle spécifié ? (Python)

Je veux limiter un nombre pour qu'il soit 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 lui permet de rester dans minN y maxN mais ça n'a pas l'air très joli. Comment pourrais-je l'améliorer ?

PS : Pour information, j'utilise Python 2.6.

79voto

Adrien Plisson Points 9750
def clamp(n, minn, maxn):
    return max(min(maxn, n), minn)

ou équivalent fonctionnel :

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 claire :

def clamp(n, minn, maxn):
    if n < minn:
        return minn
    elif n > maxn:
        return maxn
    else:
        return n

59voto

Björn Points 71

Il suffit d'utiliser numpy.clip() ( doc ) :

n = np.clip(n, minN, maxN)

Cela fonctionne également pour des tableaux entiers :

my_array = np.clip(my_array, minN, maxN)

48voto

Steve Howard Points 2944

Si tu veux être mignon, tu peux le faire :

n = sorted([minN, n, maxN])[1]

3voto

Platinum Azure Points 22380

Définissez une classe et disposez d'une méthode pour définir la valeur qui effectue ces validations.

Quelque chose qui ressemble vaguement à 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

0voto

Joe Iddon Points 13453

Ne pourriez-vous pas enchaîner quelques lignes python des déclarations conditionnelles ?

Je suis tombé sur cette question en cherchant un moyen de limiter pixel entre les valeurs 0 y 255 et ne pensait pas qu'utiliser max() y min() était très lisible, j'ai donc écrit ce qui suit function :

def clamp(x, minn, maxx):
   return x if x > minm and x < maxx else (minn if x < minn else maxx)

Je serais intéressé de voir comment quelqu'un de plus expérimenté que moi trouve cette façon de serrer une valeur. Je suppose qu'elle doit être moins efficace que l'utilisation de min() y max() mais il peut être utile pour quelqu'un qui cherche une version plus facile à lire. (pour moi en tout cas) function .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X