将数字限制在一个范围内

时间:2015-02-06 02:18:00

标签: python

现在,我有将R,G和B颜色值转换为十六进制的代码。

但是,如果用户输入无效数字(例如-20),它将返回一个完全随机的数字。

我的代码是:

def rgb(r, g, b):
    if r < 0:
        r = 0
    elif r > 255:
        r = 255
    if g < 0:
        g = 0
    elif g > 255:
        g = 255
    if b < 0:
        b = 0
    elif b > 255:
        b = 255
    return '%02x%02x%02x'.upper() % (r,g,b)

但是,我不想放置所有if / elif语句,因为它们占用了太多空间。是否有可能像r.range(0,255)那样将无效数字更改为最接近的数字?例如,-20将更改为0,而300将更改为255。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

我认为大多数人使用的成语对于某些value来说是这样的:

maxValue = 255
minValue = 0

min(maxValue, max(minValue, value))

答案 1 :(得分:2)

如果你想对它感兴趣,这很好用:

r, g, b = (min(255, max(0, c)) for c in (r, g, b))

示例:

In [1]: r, g, b = -1, 145, 289

In [2]: r, g, b = (min(255, max(0, c)) for c in (r, g, b))

In [3]: r, g, b
Out[3]: (0, 145, 255)

答案 2 :(得分:1)

如果您的值总是打包为&#34;列表般的&#34;结构(例如,元组,列表,numpy数组),然后考虑使用Numpy的clip函数。然后,在以下示例中,您可以避免将值解压缩到变量r,g和b中。

#!/usr/bin/env python


import numpy as np


def clip(r, g, b, min_val=0, max_val=255):
    return tuple(np.clip((r, g, b), min_val, max_val))


def main():
    x = clip(-20, 1, 256)
    print(x)

    x = clip(0, 300, -1)
    print(x)

    x = clip(1, 100, 255)
    print(x)

    y = (-20, 1, 256)
    y = clip(*y)  # Unpack y into r, g, b, if you like
    print(y)


if __name__ == '__main__':
    main()

输出:

(0, 1, 255)
(0, 255, 0)
(1, 100, 255)
(0, 1, 255)