Как ограничить число в пределах указанного диапазона?(Python) - PullRequest
38 голосов
/ 13 мая 2011

Я хочу ограничить число в определенном диапазоне. В настоящее время я делаю следующее:

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

Это сохраняет его в пределах minN и maxN, но выглядит не очень хорошо. Как я могу сделать это лучше?

PS: К вашему сведению, я использую Python 2.6.

Ответы [ 5 ]

53 голосов
/ 13 мая 2011
def clamp(n, minn, maxn):
    return max(min(maxn, n), minn)

или функционально эквивалентный:

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

сейчас вы используете:

n = clamp(n, 7, 42)

или делаете его совершенно ясным:

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

еще яснее:

def clamp(n, minn, maxn):
    if n < minn:
        return minn
    elif n > maxn:
        return maxn
    else:
        return n
40 голосов
/ 13 мая 2011

Если вы хотите быть милым, вы можете сделать:

n = sorted([minN, n, maxN])[1]
38 голосов
/ 15 июля 2014

Просто используйте numpy.clip() ( документ ):

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

Это также работает для целых массивов:

my_array = np.clip(my_array, minN, maxN)
2 голосов
/ 13 мая 2011

Определите класс и используйте метод для установки значения, которое выполняет эти проверки.

Что-то неопределенно похожее на приведенное ниже:

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
0 голосов
/ 30 сентября 2017

Не могли бы вы связать воедино некоторые однострочные python условные выражения?

Я сталкивался с этим вопросом, когда искал способ ограничить значения pixel между 0 и 255, иЯ не думал, что использование max() и min() было бы очень читабельным, поэтому написал следующее function:

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

Мне было бы интересно посмотреть, как кто-то более опытный, чем я, найдет этот способограничение значения.Я предполагаю, что он должен быть менее эффективным, чем использование min() и max(), но он может быть полезен для тех, кто ищет более читабельный (по крайней мере для меня) function.

...