it-swarm.com.de

Wie kann man eine Anzahl auf einen bestimmten Bereich beschränken? (Python)

Ich möchte eine Zahl auf einen bestimmten Bereich beschränken. Derzeit mache ich Folgendes:

minN = 1
maxN = 10
n = something() #some return value from a function
n = max(minN, n)
n = min(maxN, n)

Dies hält es innerhalb von minN und maxN, sieht aber nicht sehr schön aus. Wie könnte ich es besser machen?

PS: Zu Ihrer Information, ich benutze Python 2.6.

35
Mantis Toboggan
def clamp(n, minn, maxn):
    return max(min(maxn, n), minn)

oder funktional gleichwertig:

clamp = lambda n, minn, maxn: max(min(maxn, n), minn)

jetzt verwendest du:

n = clamp(n, 7, 42)

oder machen Sie es ganz klar:

n = minn if n < minn else maxn if n > maxn else n

noch klarer:

def clamp(n, minn, maxn):
    if n < minn:
        return minn
    Elif n > maxn:
        return maxn
    else:
        return n
48
Adrien Plisson

Wenn du süß sein willst, kannst du folgendes tun:

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

Verwenden Sie einfach numpy.clip() ( doc ):

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

Es funktioniert auch für ganze Arrays:

my_array = np.clip(my_array, minN, maxN)
37
Björn

Definieren Sie eine Klasse und verfügen Sie über eine Methode zum Festlegen des Werts, der diese Validierungen durchführt.

Etwas wie das Folgende:

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

Konnten Sie nicht einige einzeilige python bedingte Anweisungen aneinanderreihen?

Ich bin auf diese Frage gestoßen, als ich nach einer Möglichkeit gesucht habe, pixel Werte zwischen 0 Und 255 Zu begrenzen, und habe nicht gedacht, dass dies mit max() und min() war sehr gut lesbar und schrieb folgendes function:

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

Es würde mich interessieren, wie jemand, der erfahrener ist als ich, diese Art der Klammerung eines Wertes finden würde. Ich nehme an, es muss weniger effizient sein als die Verwendung von min() und max(), aber es kann für jemanden nützlich sein, der nach einem lesbareren sucht (zumindest für mich)function.

0
Joe Iddon