Подтвердить что ты не робот

Как ограничить число в пределах указанного диапазона? (Python)

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

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

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

PS: FYI, я использую Python 2.6.

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Просто используйте numpy.clip() (doc):

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

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

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

Ответ 4

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

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

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

Ответ 5

Не могли бы вы связать несколько однострочных 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.