5

如果它在最小值和最大值之间,我不想得到一个值。如果该值小于最小值,我想获得最小值,如果它大于最大值,我想获得最大值。我现在使用此代码,但是有内置或更智能的方法吗?

def inBetween(minv, val, maxv):
  if minv < val < maxv: return val
  if minv > val:        return minv
  if maxv < val:        return maxv

print inBetween(2,5,10) 
4

3 回答 3

12

使用min, max:

>>> def inbetween(minv, val, maxv):
...     return min(maxv, max(minv, val))
... 
>>> inbetween(2, 5, 10)
5
>>> inbetween(2, 1, 10)
2
>>> inbetween(2, 11, 10)
10
于 2013-09-04T08:54:03.853 回答
7

记录一下:这种函数通常被调用clamp(如在钳位中),有时clip。您最常为此找到的签名是clamp(val, minv, maxv). 如果您不喜欢使用函数的惯用解决方案min并且max由于函数开销,您可以使用此解决方案:

def clamp(val, minv, maxv):
    return minv if val < minv else maxv if val > maxv else val

快速'n'dirty 性能检查:

>>> import timeit
>>> timeit.timeit("clamp(1, 5, 10)", "def clamp(val, minv, maxv): return min(maxv, max(minv, val))")
1.8955198710000332
>>> timeit.timeit("clamp(1, 5, 10)", "def clamp(val, minv, maxv): return minv if val < minv else maxv if val > maxv else val")
0.5956520039999305
于 2013-09-04T09:49:34.013 回答
1

把它们放在一个列表中,对列表进行排序,选择中间元素。

>>> def inbetween(minv,val,maxv):
...     return sorted([minv,val,maxv])[1]
... 
>>> inbetween(2,5,10)
5
>>> inbetween(2,1,10)
2
>>> inbetween(2,11,10)
10
于 2013-09-04T08:58:15.187 回答