54

我想将一个数字限制在一定范围内。目前,我正在执行以下操作:

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

这使它保持在minNand内maxN,但看起来不是很好。我怎样才能做得更好?

PS:仅供参考,我使用的是 Python 2.6。

4

5 回答 5

87
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
于 2011-05-13T19:41:14.070 回答
68

只需使用numpy.clip()文档):

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

它也适用于整个数组:

my_array = np.clip(my_array, minN, maxN)
于 2014-07-15T10:32:06.797 回答
52

如果你想变得可爱,你可以这样做:

n = sorted([minN, n, maxN])[1]
于 2011-05-13T19:40:39.443 回答
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
于 2011-05-13T19:43:26.283 回答
0

你能不能把一些单行python条件语句串起来?

我在寻找一种限制andpixel之间值的方法时遇到了这个问题,并且不认为使用and是非常易读的,所以写了以下内容:0255max()min()function

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

我很想看看比我更有经验的人如何找到这种限制值的方法。我认为它一定比使用min()and效率低max(),但它可能对寻找更具可读性的人有用(至少对我来说) function

于 2017-09-30T14:42:01.740 回答