Как ограничить число в пределах указанного диапазона? (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.
Ответы
Ответ 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
.